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

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.mzph.cn/diannao/42684.shtml

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

相关文章

pwm 呼吸灯(如果灯一直亮或者一直灭)

&#xff08;这个文章收藏在我的csdn keil文件夹下面&#xff09; 如果这样设置预分频和计数周期&#xff0c;那么算出来的pwm频率如下 人眼看起来就只能是一直亮或者灭&#xff0c;因为pwm的频率太高了&#xff0c;但是必须是频率够高&#xff0c;才能实现呼吸灯的缓慢亮缓慢…

SPL-404:如何彻底改变Solana上的NFT与DeFi

在不断发展的数字资产领域中&#xff0c;非同质化Token&#xff08;NFT&#xff09;已成为一股革命性力量&#xff0c;彻底改变了我们对数字所有权的看法和互动方式。从艺术和收藏品到游戏和虚拟房地产&#xff0c;NFT吸引了创作者、投资者和爱好者的想象力。 本指南将带您进入…

MyBatisPlus-分页插件的基本使用

目录 配置插件 使用分页API 配置插件 首先&#xff0c;要在配置类中注册MyBatisPlus的核心插件&#xff0c;同时添加分页插件。&#xff08;可以放到config软件包下&#xff09; 可以看到&#xff0c;我们定义了一个配置类&#xff0c;在配置类里声明了一个Bean,这个Bean的名…

排序 -- 计数排序以及对排序的总结

到了这篇文章就说明常见的排序我们就快要讲完了&#xff0c;那这篇文章我们就讲一下非比较排序--计数排序。 一、非比较排序 1.基本思想 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数 根据统计的结果将序列…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

打造属于你的私人云盘:在 OrangePi AIpro 上搭建个人云盘

随着数字化时代的到来&#xff0c;数据的存储和管理变得愈发重要。相比于公共云存储服务&#xff0c;搭建一个属于自己的个人云盘不仅能够更好地保护隐私&#xff0c;还可以更灵活地管理数据。 近期刚好收到了一个 香橙派 AIpro 的开发板&#xff0c;借此机会用来搭建一个属于…

美股交易相关知识点 持续完善中

美股交易时间 美东时间&#xff1a;除了凌晨 03:50 ~ 04:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可以交易的。 如果是在香港或者北京时间下交易要区分两种: 美东夏令时&#xff1a;除了下午 15:50 ~ 16:00 这10分钟时间不可交易以外&#xff0c;其他时间都是可…

法国工程师IMT联盟 密码学及其应用 2022年期末考试

1 密码学 1.1 问题1 对称加密&#xff08;密钥加密) 1.1.1 问题 对称密钥la cryptographie symtrique和公开密钥有哪些优缺点&#xff1f; 1.1.1.1 对称加密&#xff08;密钥加密)的优缺点 1.1.1.1.1 优点 加解密速度快encrypt and decrypt&#xff1a;对称加密算法通常基于…

【vue组件库搭建06】组件库构建及npm发包

一、格式化目录结构 根据以下图片搭建组件库目录 index.js作为入口文件&#xff0c;将所有组件引入&#xff0c;并注册组件名称 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

一、MyBatis

一、MyBatis 1、MyBatis简介 1.1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。…

计算机网络之无线局域网

1.无线局域网工作方式 工作方式&#xff1a;每台PC机上有一个无线收发机&#xff08;无线网卡&#xff09;&#xff0c; 它能够向网络上的其他PC机发送和接受无线电信号。 与有线以太网相似&#xff0c;无线局域网也是打包方式发送数据的。每块网卡都有一个永久的、唯一的ID号…

Unity2D - 基本战斗系统(Battle System Design)

1. 攻击逻辑 在Entity中初始化两个变量&#xff0c;因为在每个角色几乎都拥有攻击状态。这两个变量分别是transform类&#xff0c;接收一个坐标和一个半径画一个圆作为攻击的判定范围 public Transform attackCheck; public float attackCheckRadius; 为了可视化攻击范围&am…

基于ROS的智能网联车远程交互软件,全UI无需记忆指令,剑指核心原理。

基于ROS的智能网联车远程交互软件&#xff0c;全UI无需记忆指令&#xff0c;剑指核心原理。 服务于中汽恒泰&#xff0c;伟大的项目&#xff0c;希望看官点赞&#xff0c;谢谢~~ 进程&#xff08;节点&#xff09;列表化&#xff0c;参数面板化&#xff0c;实现快速机器人配置…

Linux--V4L2摄像头驱动框架及UVC浅析

一、前言 对于一个usb摄像头&#xff0c;它的内核驱动源码位于/drivers/media/usb/uvc/ 核心层&#xff1a;V4L2_dev.c文件 硬件相关层&#xff1a; uvc_driver.c文件 本篇记录基于对6.8.8.8内核下vivid-core.c文件&#xff08;虚拟视频驱动程序&#xff09;的分析&#xff…

澳大利亚媒体发稿:怎样用图表提高易读性?-华媒舍

媒体发稿的可读性变得尤为重要。读者们不会再有时间与耐心去阅读文章繁琐的文本&#xff0c;他们更喜欢简洁明了的信息展现形式&#xff0c;在其中图表是一种极为高效的专用工具。下面我们就详细介绍怎么使用图表提高澳大利亚新闻媒体发稿的可读性&#xff0c;以适应读者的需要…

java 栅栏(CyclicBarrier)

Java中的栅栏&#xff08;CyclicBarrier&#xff09;是一种用于协调多个线程并发工作的同步辅助类。与CountDownLatch不同&#xff0c;CyclicBarrier允许一组线程相互等待&#xff0c;直到所有线程都到达一个共同的屏障点&#xff08;barrier&#xff09;后&#xff0c;才继续执…

CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)

CSS 样式选择器&#xff0c;用于选中页面中的 html 元素&#xff0c;以便添加 CSS 样式。 按渲染性能由高到低 依次是&#xff1a; ID 选择器 #id 通过元素的 id 属性选中元素&#xff0c;区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…

【SpringCloud应用框架】Nacos集群架构说明

第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止&#xff0c;已经完成了对Nacos的一些基本使用和配置&#xff0c;接下来还需要了解一个非常重要的点&#xff0c;就是Nacos的集群相关的…

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…

12.x86游戏实战-汇编指令and or not

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;11.x86游戏实战-汇编指令add sub inc dec and指令是与的意思 or指令是或的意思 …