目录
1、字符串中找出连续最长的数字子串
1.1 题目
1.2 思路
首先,我们定义一个ret作为返回的字符串,tmp作为比较ret更新的字符串,遍历字符串,当遇见数字,尾插进tmp中,遇见其他字符则比较ret和tmp的长度,更新ret,并清空tmp,重复以上操作,直到遍历完字符串,理清思路,接下来就是代码实现
1.3 代码实现
比较法
#include <iostream>
using namespace std;
int main()
{
string str,ret,tmp;
cin >> str;
for(int i = 0;i < str.size();i++)
{
while (str[i] >= '0' && str[i] <= '9')
{
tmp += str[i];
i++;
}
if(tmp.size() > ret.size())
ret = tmp;
tmp = "";
}
cout << ret << endl;
return 0;
}
双指针
利用begin标记遍历出的数字字符的位置,且定义一个从 j 从begin开始遍历连续数字字符串的长度,遇见非数字字符停止,求得 j-i 的值,保存到 len 中,然后将i 置到 j 处继续遍历,重复以上操作,最后输出
#include <iostream>
using namespace std;
int main()
{
string str;
cin >> str;
int begin = -1,len = 0,n = str.size();
for(int i = 0; i < n;i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
int j = i;
while (j < n && str[j] >= '0' && str[j] <= '9')
j++;
if(j-i > len)
{
begin = i;
len = j-i;
}
i = j;
}
}
cout << str.substr(begin,len) << endl;
return 0;
}
2、岛屿数量
2.1 题目
2.2 思路
这是一道典型的搜索类题目,属于在一个二维数组中进行搜索、扩散、累计等。所以马上就想到了深度优先搜索dsf和广度优先搜索bfs,然后实现统计。
把联通的区域标记,当发现没有标记过的陆地时,就把这个联通块继续标记,重复这种操作。
接下来,就是代码
2.3 代码实现
class Solution {
public:
int m ,n;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
bool vis[201][201] = {0};
int solve(vector<vector<char> >& grid)
{
m = grid.size(),n = grid[0].size();
int ret = 0;
for(int i = 0;i < m;i++)
{
for(int j = 0;j < n;j++)
{
if(grid[i][j] == '1' && !vis[i][j])
{
ret++;
dfs(grid,i,j);
}
}
}
return ret;
}
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],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 思路
这里我们可以用一下暴力枚举去解决这道题,遍历每三根,判断一下能否构成三角形,在看下剩下的能否构成三角形,能则输出yes,否则输出no,但是用暴力解法会有许多冗余的操作,比如重复枚举,所以可以思考一下怎么优化。比如使用dfs,但是边界情况不好控制。
这里说一下优化后的枚举,先把六根棍子排序,仅需判断前两个数相加是否大于第三个数,判断是否为三角形
举个例子:
3.3 代码实现
暴力枚举(优化前)
#include <iostream>
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)
{
for (int i = 0; i < 3; i++)
{
for (int j = i + 1; j < 4; j++)
{
for (int k = j + 1; k < 5; k++)
{
if (isTriangle(arr[i], arr[j], arr[k]))
{
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];
if (CheckTriangles(arr))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
枚举(优化)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin >>t;
int arr[6];
while(t--)
{
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;
}
本篇完,下篇见!