【刷题汇总--字符串中找出连续最长的数字串、岛屿数量、拼三角】

news2024/9/21 4:34:57

C++日常刷题积累

  • 今日刷题汇总 - day007
    • 1、字符串中找出连续最长的数字串
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现 -- 比较
      • 1.4、程序实现 -- 双指针
    • 2、岛屿数量
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现 - dfs
    • 3、拼三角
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 -- 蛮力法
      • 3.4、程序实现 -- 巧解(单调性)
    • 4、题目链接

今日刷题汇总 - day007

1、字符串中找出连续最长的数字串

1.1、题目

在这里插入图片描述

1.2、思路

读完题知道,需要求一段字符串中最长且是连续的数字字符串。既然涉及到找最长,意味着具有比较关系,所以立马想到利用一个变量字符串temp进行统计各个连续的数字字符串的长度,最后留取最长retstr的返回即可。另外,还可以利用双指针,标记每一次出现数字字符的起始位置,然后纪录其连续的长度,然后返回最长处的其实位置的字串也行。那么。接下来两个思路都写一写吧。

1.3、程序实现 – 比较

首先,我们根据思路和题目定义三个字符串,一个str作为原字符串输入,一个retstr最后最后的返回字符串,一个temp作为比较retstr更新字符串,接着,开始遍历str的各个字符,当遇见数字字符,则尾插进temp中,否则,遇见其它字符则比较retstr和temp的长度,如果temp的长度大于retstr时,则保留最长的数字字符串到retstr,否则清空短的字符串temp继续遇见遍历到下一个数字字符再次依次尾插连续数字字符统计长度,依次类推,得到最后的最长数字连续字符串retstr输出即可。

#include <iostream>
#include <string>
using namespace std;

bool isNum(char c)
{
    return c <= '9' && c >= '0';
}

int main() {
    string str;
    string retstr;
    string temp;
    cin >> str;
    size_t len = str.size();
    for (int i = 0; i <= len; i++)
    {
        if (isNum(str[i]))
        {
            temp += str[i];
        } 
        else
        {
            if (retstr.size() < temp.size())
                retstr = temp;
            else
                temp.clear();
        }
    }
    cout << retstr << endl;
    return 0;
}

在这里插入图片描述

在这里插入图片描述

1.4、程序实现 – 双指针

接下来,双指针需要利用begin标记遍历出现数字字符的位置,且定义一个j从begin处开始遍历连续数字字符串的长度,遇见非数字字符停止,求得 j - i 的长度保存到maxlen中,然后,将 i 置到 j 处继续遍历,且每一次标记begin和maxlen保持更新为最长的数字字符串的起始地址和长度即可。最后利用substr输出指定位置的字串即可。

#include <iostream>
#include <string>
using namespace std;

bool isNum(char ch)
{
    return ('0' <= ch && ch <= '9');
}

int main()
{
    string str;
    cin >> str;
    int begin = -1;
    int maxlen = -1;
    for(int i = 0;i< str.size();i++)
    {
        if(isNum(str[i]))
        {
            int j = i;
            while(j < str.size() && isNum(str[j]))
                j++;
            if(j -i > maxlen)
            {
                begin = i;
                maxlen = j-i;
            }
            i = j;
        }     
    }
    cout << str.substr(begin, maxlen) << endl;
    return 0;
}

在这里插入图片描述

在这里插入图片描述

2、岛屿数量

2.1、题目

在这里插入图片描述

2.2、思路

读完题知道,又是属于在一个二维数组里进行搜索/扩散/累计啊等问题。那么立马就想到了深度优先搜索dfs和广度优先搜索bfs,然后让我们实现统计,属于联通的岛屿(即具有上下左右连通的‘1’)的个数。那么这里就采用dfs解决即可。比之前的腐烂的苹果和单词搜索更简单一些,因为只需要计数即可。接下来,就是程序实现。

2.3、程序实现 - dfs

首先,既然采用dfs把固定的套路和模板先写上即可。定义m,n计算二维数组的大小,方便稍后遍历,再定义两个方向数组dx和dy,接着定义bool类型的vis数组,表示是否已连通。模板写好,接着就是遍历二维数组判断是否是岛屿,是则计数count且dfs搜索上下左右是否连通。连通就规划为一块岛屿,否则就继续遍历,直到规划出所有连通的岛屿,规划出多少那么coun就恰好统计出结果,最后返回count即可。

class Solution {
public:
    int m,n;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    bool vis[201][201] = { false };

    int solve(vector<vector<char> >& grid)
    {
        m = grid.size();
        n = grid[0].size();

        int count = 0;
        for(int i = 0;i < m;i++)
        {
            for(int j = 0;j < n;j++)
            {
                if(grid[i][j] == '1' && !vis[i][j])
                {
                    count++;
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }
};

那么,继续完善dfs函数,其实方法都类似,先进入dfs后标记当前属于岛屿,再此岛屿基础上,就是在4个方向上判断是否是岛屿‘1’且没有越界且没有被标记已连通,是则与当前岛屿执行递归标记连通,否则周围就没有需要连通的岛屿了。

class Solution {
public:
    int m,n;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    bool vis[201][201] = { false };

    int solve(vector<vector<char> >& grid)
    {
        m = grid.size();
        n = grid[0].size();

        int count = 0;
        for(int i = 0;i < m;i++)
        {
            for(int j = 0;j < n;j++)
            {
                if(grid[i][j] == '1' && !vis[i][j])
                {
                    count++;
                    dfs(grid,i,j);
                }
            }
        }
        return count;
    }

    void dfs(vector<vector<char> >& grid, int i,int j)
    {
        vis[i][j] = true;
        for(int k = 0;k < 4;k++)
        {
            int x = i + dx[k];
            int y = j + dy[k];
            if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' && !vis[x][y])
                dfs(grid,x,y);
        }
    }
};

在这里插入图片描述
在这里插入图片描述

3、拼三角

3.1、题目

在这里插入图片描述

3.2、思路

读完题,理解到让我们实现在6根木棍中,任选3根木棍来拼接三角形,其次,还得判断在剩下的3根木棍中是否还能拼接成三角形。如果同时能,则输出“Yes”,否则输出"No"即可。由于,只有6根数量级不大,直接尝试一波蛮力法试试,蛮力法思路就是遍历每3根都去判断一下,能够组成三角形,能则继续判断剩下3根是否也能组成三角形,能则输出“Yes”,如果不能组成三角形那么输出“No”即可。另外,在写蛮力法时发现,会有很多的冗余操作和判断,会发现具有一些特定,即具备判断的单调性(稍后画图理解),所以利用这个特点且只针对这道题,就有了更优解法。其次,看其它大佬也有用dfs的,但是我没想出来,而且这里用起来很麻烦且边界不好控制,就不写dfs了。
那么接下来,就是程序实现。

3.3、程序实现 – 蛮力法

首先,根据蛮力法的思路,具体分为以下几个步骤:
(1)、首先,先对木棍长度进行排序,目的是简化,便于逻辑思考下标处理等;
(2)、套三层for循环,遍历判断check三角形的性质是否满足(任意两边之和大于第三边);
(3)、再(2)满足条件下,继续判断剩下check the other three的三根木棍是否满足三角形性质;
那么,先根据题目要求和思路写好基本框架,再把数组sort排序,再为了增加代码阅读性,我这里采用封装了CheckTriangles函数单独处理是否满足三角形逻辑。

#include <iostream>
#include <algorithm>
using namespace std;

bool CheckTriangles(int* arr)
{
}

int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int arr[6];
        for (int i = 0; i < 6; i++)
            cin >> arr[i];
         sort(arr, arr + 6);//步骤1:排序
         
        if (CheckTriangles(arr))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

接着,实现蛮力法遍历逻辑,先根据三边需要求和比较的的关系,写三层for循环,其次,额外封装了一个isTriangle函数,判断是否满足三角形性质,注意哈,这里需要任意两边之和大于第三边为真才满足哈。

#include <iostream>
#include <algorithm>
using namespace std;

bool isTriangle(int a, int b, int c)
{
    return (a + b > c && a + c > b && b + c > a);
}

bool CheckTriangles(int* arr)
{
	//步骤2:for循环嵌套
    for (int i = 0; i < 3; i++)
    {
        for (int j = i + 1; j < 4; j++)
        {
            for (int k = j + 1; k < 5; k++)
            {
                //步骤3: Check -- isTriangle
                if (isTriangle(arr[i], arr[j], arr[k]))
                {
                    //步骤4: Check the other three -- isTriangle
                }
            }
        }
    }
    return false;
}

int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int arr[6];
        for (int i = 0; i < 6; i++)
            cin >> arr[i];
         sort(arr, arr + 6);//步骤1:排序
         
        if (CheckTriangles(arr))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

最后一步就是检查,若步骤3满足,则剩下的三根木棍是否仍然满足三角形性质。所以,这里定义Residue[3]表示存放剩余木棍的数组,定义index表示它的下标,方便操作,然后遍历原数组,把剩下的数组元素,存放进Residue数组,这样就可以方便把Residue数组每一根木棍一起放进isTriangle进行拼接验证是否满足三角形性质,若满足,则返回ture,否则继续回到步骤2,继续遍历结束为止,直到最后都没有满足,则返回false,则main输出“No”,否则输出"Yes"即可。

#include <iostream>
#include <algorithm>
using namespace std;

bool isTriangle(int a, int b, int c)
{
    return (a + b > c && a + c > b && b + c > a);
}

bool CheckTriangles(int* arr)
{
	//步骤2:for循环嵌套
    for (int i = 0; i < 3; i++)
    {
        for (int j = i + 1; j < 4; j++)
        {
            for (int k = j + 1; k < 5; k++)
            {
                //步骤3: Check -- isTriangle
                if (isTriangle(arr[i], arr[j], arr[k]))
                {
                    //步骤4: Check the other three -- isTriangle
                    int Residue[3];
                    int idx = 0;
                    for (int m = 0; m < 6; m++)
                    {
                        if (m != i && m != j && m != k)
                        {
                            Residue[idx++] = arr[m];
                        }
                    }
                    if (isTriangle(Residue[0], Residue[1], Residue[2]))
                    {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int arr[6];
        for (int i = 0; i < 6; i++)
            cin >> arr[i];
         sort(arr, arr + 6);//步骤1:排序
         
        if (CheckTriangles(arr))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述

3.4、程序实现 – 巧解(单调性)

解法二,基于解法一的情况下,发现此题具有单调性的特点,所以利用这一特点,能够更快的方便判断求解。为了更好的理解,画个图演示:
在这里插入图片描述

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int arr[6];
        for(int i = 0;i < 6;i++)
            cin >> arr[i];
        sort(arr,arr+6);
        
        if(arr[0] + arr[1] > arr[2] && arr[3] + arr[4] > arr[5] ||
           arr[0] + arr[2] > arr[3] && arr[1] + arr[4] > arr[5] ||
           arr[0] + arr[3] > arr[4] && arr[1] + arr[2] > arr[5] ||
           arr[0] + arr[4] > arr[5] && arr[1] + arr[2] > arr[3])
        {
            cout << "Yes" << endl;
        }
        else
            cout << "No" << endl;
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述

4、题目链接

字符串中找出连续最长的数字串
岛屿数量
拼三角

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制冷软件SOLKANE单级制冷循环计算

SOLKANE软件下载 单级制冷循环参数介绍 输入数据&#xff1a; 1.蒸发器&#xff1a; 温度&#xff1a;蒸发温度t6&#xff08;露点温度&#xff09;。 过热&#xff1a;制冷剂t6-t6在蒸发器中过热。 压力损失&#xff1a;蒸发器入口和出口之间的压力下降。 制冷量&#x…

Git管理源代码、git简介,工作区、暂存区和仓库区,git远程仓库github,创建远程仓库、配置SSH,克隆项目

学习目标 能够说出git的作用和管理源代码的特点能够如何创建git仓库并添加忽略文件能够使用add、commit、push、pull等命令实现源代码管理能够使用github远程仓库托管源代码能够说出代码冲突原因和解决办法能够说出 git 标签的作用能够使用使用git实现分支创建&#xff0c;合并…

linux-5.10.110内核源码分析 - Freescale ls1012a pcie msi中断

1、dts msi控制器描述 1.1、dts描述 msi: msi-controller11572000 {compatible "fsl,ls1012a-msi";reg <0x0 0x1572000 0x0 0x8>;msi-controller;interrupts <0 126 IRQ_TYPE_LEVEL_HIGH>; };ls1012a msi控制器具体介绍可以参考官网手册”25.1.1 PC…

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言&#xff08;DDL&#xff09;2. 数据操作语言&#xff08;DML&#xff09;3. 数据查询语言&#xff08;DQL&#xff09;4. 数据控制语言&#xff08;DCL&#xff09;总结 在 MySQL 数据库管理系统中&#xff0c;SQL 语句可以根据其功能分为不同的类别&…

玫瑰千层烤饼:味蕾的芬芳盛宴

在美食的缤纷世界里&#xff0c;有一种独特的存在&#xff0c;它融合了玫瑰的芬芳与烤饼的酥脆&#xff0c;那便是令人陶醉的甘肃美食玫瑰千层烤饼。食家巷玫瑰千层烤饼&#xff0c;宛如一件精心雕琢的艺术品。每一层薄如纸张的面皮&#xff0c;都承载着制作者的细腻与用心。层…

GD32实战篇-双向数控BUCK-BOOST-BOOST升压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

JavaWeb-【1】HTML

笔记系列持续更新,真正做到详细!!本次系列重点讲解后端,那么第一阶段先讲解前端 目录 1、Javaweb技术体系 2、BS架构说明 3、官方文档 4、网页组成 5、HTML 6、HTML快速入门 7、HTML基本结构 8、HTML标签 ​9、HTML标签使用细节 ①、font标签 ②、字符实体 ③、标…

【在Linux世界中追寻伟大的One Piece】HTTPS协议原理

目录 1 -> HTTPS是什么&#xff1f; 2 -> 相关概念 2.1 -> 什么是"加密" 2.2 -> 为什么要加密 2.3 -> 常见的加密方式 2.4 -> 数据摘要 && 数据指纹 2.5 -> 数字签名 3 -> HTTPS的工作过程 3.1 -> 只使用对称加密 3.2 …

Django之项目开发(一)

一、项目的生命周期介绍 传统Web 项目的生命周期指的是从开始构建一个网站到该网站完成并维护的整个过程。通常情况下,Web 项目的生命周期包括以下几个阶段 需求分析阶段:在这个阶段,项目组会与客户进行沟通,确定网站的功能、内容和设计。 主要由产品经理参与产出思路与方案…

谷粒商城学习笔记-逆向工程错误记录

文章目录 1&#xff0c;Since Maven 3.8.1 http repositories are blocked.1.1 在maven的settings.xml文件中&#xff0c;新增如下配置&#xff1a;1.2&#xff0c;执行clean命令刷新maven配置 2&#xff0c;internal java compiler error3&#xff0c;启动逆向工程报错&#x…

【qt】获取主机信息系统

话不多说,先一睹芳颜! 如果你也想达到这种效果,那咱们就开始吧! 目录 一.登录界面设计1.ui登录设计 二.加载界面1.lineEdit的密码输入模式2.lineEdit按回车跳转的信号3.密码的判断4.创建加载界面5.创建定时器来进行进度条的移动6.定时器执行的槽函数 三.主机信息界面1.主机信息…

软件系统架构的一些常见专业术语

分层架构是逻辑上的&#xff0c;在物理部署上&#xff0c;三层结构可以部署在同一个物理机器上&#xff0c;但是随着网站业务的发展&#xff0c;必然需要对已经分层的模块分离部署&#xff0c;即三层结构分别部署在不同的服务器上&#xff0c;使网站拥有更多的计算资源以应对越…

瑞芯微rk356x TF卡烧写选择指定的屏幕打印烧写的过程

rk356x中TF卡烧写屏幕选择 1、开发环境2、问题描述3、解决办法4、总结5、 图片展示1、开发环境 系统:linux系统 芯片:356x 显示:多屏显示(HDMI, MIPI, LVDS, EDP) 2、问题描述 由于在多屏显示的情况下,HDMI屏在LVDS、MIPI或者EDP协同下,默认情况下,在TF卡烧录过程中…

QT——Excel实现自绘区域选择边框

文章目录 一、自绘区域边框1.1、效果展示2.2、问题整理2.2.1、重绘单元格选择区2.2.2、选择区域的大小 一、自绘区域边框 1.1、效果展示 单选 多选 2.2、问题整理 2.2.1、重绘单元格选择区 误区: 继承QStyledItemDelegate重写paint,测试发现只能在单元格内绘制。 通过继…

秋招力扣刷题——从前序与中序遍历序列构造二叉树

一、题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 二、解法思路 根据二叉树的遍历结构重构二叉树&#xff0c;至少两种遍历方式结合&…

操作系统智能助手OS Copilot评测报告

背景 如果不是朋友告知&#xff0c;我还不知道阿里云推出了【操作系统智能助手OS Copilot】这样一款产品。 我做系统运维的工作还是挺多的&#xff0c;知道系统运维工作的一些痛点&#xff1b;例如&#xff1a; Linux命令繁杂&#xff0c;想全部记住不太可能&#xff0c;多数…

自注意力 公式解释

公式 (\mathbf{y}_i f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^d) 描述了自注意力机制中单个词元的输出表示如何生成。我们来逐步解释这个公式&#xff1a; 输入序列 (\mathbf{x}_1, \mathbf{x}_2, \ldots, \math…

MySQL之备份与恢复(八)

备份与恢复 还原逻辑备份 如果还原的是逻辑备份而不是物理备份&#xff0c;则与使用操作系统简单地复制文件到适当位置的方式不同&#xff0c;需要使用MySQL服务器本身来加载数据到表中。在加载导出文件之前&#xff0c;应该先花一点时间考虑文件有多大&#xff0c;需要多久加…

数据结构--二叉树和堆

目录 1.基本概念 2.树的遍历方法 3.满二叉树&&完全二叉树 4.逻辑结构&&物理结构 5.推理公式 6.二叉树应用--堆 7.简单实现堆 1.基本概念 &#xff08;1&#xff09;这个里面的概念还是比较多的&#xff0c;但是大部分我们只需要了解即可&#xff0c;因为…

如何实现一套键盘鼠标控制两台计算机(Mouse Without Borders快速上手教程)

需求背景 当我们需要同时使用一台主机和一台笔记本的时候&#xff0c;如果使用两套键盘和鼠标分别操作各自的系统&#xff0c;非常地不便捷且非常占据桌面空间。那么如何使用一套键盘鼠标控制两台电脑呢&#xff1f; 需求实现 软件说明 我们可以使用微软官方的一款软件Mous…