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

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;elsetemp.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;elsecout << "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 -- isTriangleif (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;elsecout << "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 -- isTriangleif (isTriangle(arr[i], arr[j], arr[k])){//步骤4: Check the other three -- isTriangleint 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;elsecout << "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;}elsecout << "No" << endl;}return 0;
}

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

4、题目链接

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

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

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

相关文章

Matlab协方差矩阵分解法生成随机场

Matlab协方差矩阵分解法生成随机场 相关系数矩阵 % function outcohesion(x,y,mu,theta) % end % xyload(F:\Research-OUC\基于机器许学习模型的海底斜坡可靠度研究\基于comsol的斜坡稳定性分析\comsol网格操作\grid_operate-matlab.mphtxt); % xxy(:,1); % yxy(:,2); Xlinspac…

贪心 | Java | LeetCode 455, 376, 53 做题总结

贪心算法介绍 贪心算法&#xff1a;贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 说实话贪心算法并没有固定的套路。 一般解题步骤 贪心算法一般分为如下四步&#xff1a; ① 将问题分解为若干个子问题 ② 找出适合的贪心策略 ③ 求解每一个子问题的…

从打印到监测:揭秘3D生物打印中天然水凝胶的创新之路?

从打印到监测&#xff1a;揭秘3D生物打印中天然水凝胶的创新之路&#xff1f; 在组织工程和再生医学领域&#xff0c;生物墨水是构建3D组织结构的关键材料。传统上&#xff0c;生物墨水主要基于细胞外基质 (ECM) 水凝胶&#xff0c;例如胶原蛋白、明胶、脱乙酰壳多糖、海藻酸盐…

Matplotlib 学习

知识点 1.plot()&#xff1a;用于绘制线图和 散点图scatter() 函数&#xff1a;plot() 函数可以接受许多可选参数&#xff0c;用于控制图形的外观&#xff0c;例如&#xff1a;颜色: colorblue 控制线条的颜色。线型: linestyle-- 控制线条的样式&#xff0c;例如虚线。标记…

ssrf结合redis未授权getshell

目录 漏洞介绍 SSRF Redis未授权 利用原理 环境搭建 利用过程 rockylinux cron计划任务反弹shell 写公钥免密登录 ubuntu 写公钥免密登录 漏洞介绍 SSRF SSRF&#xff08;server side request forgrey&#xff09;服务端请求伪造&#xff0c;因后端未过滤用户输入&…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

【OJ】运行时错误(Runtime Error)导致递归爆栈问题

在进行OJ赛时&#xff0c; 题目&#xff1a;给你一个整数n&#xff0c;问最多能将其分解为多少质数的和。在第一行输出最多的质数数量k,下一行输出k个整数&#xff0c;为这些质数。 出现运行时错误 代码如下&#xff1a; def main():# code heren int(eval(input()))list …

Vatee万腾平台:创新科技,驱动未来

在科技日新月异的今天&#xff0c;每一个创新的火花都可能成为推动社会进步的重要力量。Vatee万腾平台&#xff0c;作为科技创新领域的佼佼者&#xff0c;正以其卓越的技术实力、前瞻性的战略眼光和不懈的探索精神&#xff0c;驱动着未来的车轮滚滚向前。 Vatee万腾平台深知&am…

flask使用定时任务flask_apscheduler(APScheduler)

Flask-APScheduler描述: Flask-APScheduler 是一个 Flask 扩展&#xff0c;增加了对 APScheduler 的支持。 APScheduler 有三个内置的调度系统可供您使用&#xff1a; Cron 式调度&#xff08;可选开始/结束时间&#xff09; 基于间隔的执行&#xff08;以偶数间隔运行作业…

Linux系统安装软件包的方法rpm和yum详解

起因&#xff1a; 本篇文章是记录学习Centos7的历程 关于rpm 常见命令 1&#xff09;查看已经安装的软件包 rpm -q 软件包名 2&#xff09;查看文件的相关信息 rpm -qi 软件包名 3&#xff09;查看软件包的依赖关系 就是说要想安装这个软件包&#xff0c;就必须把一些前…

【matlab】状态空间模型与传递函数模型的建立与转换

目录 SISO系统 MIMO系统 状态空间模型 状态空间模型到传递函数模型的转换 传递函数模型到状态空间模型的转换 (1) 转换函数ss() (2) 规范形转换函数canon() (3) 常微分方程(传递函数)转换为状态空间模型函数dif2ss() 状态空间模型的变换 特征值、特征向量与广义特征向量的计算…

使用自动化测试确保接口正确性的详细指南!

引言&#xff1a; 随着软件开发的迅速发展&#xff0c;接口的正确性成为了确保应用程序质量的关键要素之一。自动化测试是一种强大的工具&#xff0c;可以帮助开发人员和测试人员减少错误&#xff0c;提高测试覆盖率&#xff0c;并加快测试过程。本文将详细介绍从零开始如何使…

阶段三:项目开发---搭建项目前后端系统基础架构:QA:可能遇到的问题及解决方案

任务实现 常见问题1&#xff1a;文件监视程序的系统限制。 1、错误提示&#xff1a;如果在Vue项目中&#xff0c;使用【 npm run serve】运行kongguan_web项目时报以下错误&#xff1a; 2、产生原因&#xff1a;文件监视程序的系统产生了限制&#xff0c;达到了默认的上限&am…

ubuntu软件源的两种格式和环境变量

1. ubuntu的/etc是什么目录&#xff1f; 在Ubuntu操作系统中&#xff0c;/etc/是一个特殊的目录&#xff0c;它包含系统的配置文件。这些配置文件用于设置各种系统和应用程序的参数和选项。 一般来说&#xff0c;用户可以在这个目录下找到各种重要的配置文件&#xff0c;如网络…

AcWing 1260:二叉树输出

【题目来源】https://www.acwing.com/problem/content/1262/【题目描述】 树的凹入表示法主要用于树的屏幕或打印输出&#xff0c;其表示的基本思想是兄弟间等长&#xff0c;一个结点的长度要不小于其子结点的长度。 二叉树也可以这样表示&#xff0c;假设叶结点的长度为 1&…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative &#xff0c;卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片&#xff0c;默认拖动的时候就会导致像上图一样变成了选中图片移动&#xff0c;从而没法触发拖动事件。消…

vue3使用方式汇总

1、引入iconfont阿里图库图标&#xff1a; 1.1 进入阿里图标网站&#xff1a; iconfont阿里&#xff1a;https://www.iconfont.cn/ 1.2 添加图标&#xff1a; 1.3 下载代码&#xff1a; 1.4 在vue3中配置代码&#xff1a; 将其代码复制到src/assets/fonts/目录下&#xff1…

SSM中小学生信息管理系统 -计算机毕业设计源码02677

摘要 随着社会的发展和教育的进步&#xff0c;中小学生信息管理系统成为学校管理的重要工具。本论文旨在基于SSM框架&#xff0c;采用Java编程语言和MySQL数据库&#xff0c;设计和开发一套高效、可靠的中小学生信息管理系统。中小学生信息管理系统以学生为中心&#xff0c;通过…

MIT6.s081 2021 Lab Traps

使用gdb调试xv6内核 从最近两个 Lab 开始&#xff0c;代码逻辑的复杂度明显上升&#xff0c;对内核进行调试可能是帮助理解操作系统机制的绝佳方法。因此在开始本 Lab 之前&#xff0c;我们先来配置一下针对 xv6 内核的 gdb 调试器。 安装 gdb-multiarch. 利用包管理工具进行…

Linux基础:一. 简单的命令

文章目录 一. 简单的命令1.1 关机1.2 重启1.3 控制台打印工作目录1.4 切换当前目录1.5 列出当前目录中的目录和文件1.6 列出指定目录中的目录和文件1.7 控制台清屏1.8 查看和设置时间1.8.1 查看时间1.8.2 设置时间&#xff0c;需要管理员权限 一. 简单的命令 1.1 关机 comman…