今天的题比较温和,一道查找,一道dfs,一道直接暴力遍历。
一、在字符串查找连续最长的数字字符串
这道题直接双指针,一定要考虑字母既有小写也有大写
#include<iostream>
using namespace std;
int main()
{
char arr[3000] = { 0 };
cin >> arr;
int i = 0;
int maxsize = 0;
int max = 0;
while (arr[i] != 0)
{
int flag = 0;
if (arr[i] <= '9' && arr[i] >= '0')
flag = 1;
if (flag)
{
int j = i;
while (arr[j] != 0 && arr[j] >= '0' && arr[j] <= '9')
{
j++;
}
if (maxsize < j - i)
{
maxsize = j - i;
max = i;
}
i = j;
}
i++;
}
while (maxsize--)
{
cout << arr[max++];
}
}
二、岛屿数量
典型dfs,找到一片完整的1区域后,全部变成0,找下一个
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 判断岛屿数量
* @param grid char字符型二维数组
* @param gridRowLen int grid数组行数
* @param gridColLen int* grid数组列数
* @return int整型
*/
#include<stdio.h>
typedef struct site
{
int x;
int y;
int di;
int count;//记录更改方向次数,不能超过4次
}site;
typedef struct SL
{
site* arr;
int size;
int capacity;
}SL;
void Push(SL* s, int x, int y, int di)
{
site m;
m.di = di;
m.x = x; m.y = y;
m.count = 0;
if (s->size == s->capacity)
{
s->capacity = s->capacity == 0 ? 4 : 4 * s->capacity;
s->arr = (site*)realloc(s->arr, sizeof(site) * s->capacity);
}
s->arr[s->size] = m;
(s->size)++;
}
void pop(SL* s)
{
if (s->size)
(s->size)--;
}
int no_sam(SL* s, site n)
{
int i = 0;
for (i; i < s->size; i++)
{
if (s->arr[i].x == n.x && s->arr[i].y == n.y)
return 0;
}
return 1;
}
void dfs(char** grid, int gridRow, int gridCol, int x, int y)
{
site cur;
SL s;
s.arr = NULL;
s.capacity = 0;
s.size = 0;
cur.di = 1;
cur.x = x;
cur.y = y;
cur.count = 0;
Push(&s, cur.x, cur.y, cur.di);
while (s.size > 0)
{
if (cur.di == 1)
{
cur.y++;
}
else if (cur.di == 2)
{
cur.x++;
}
else if (cur.di == 3)
{
cur.y--;
}
else if (cur.di == 4)
{
cur.x--;
}
while (cur.x >= 0 && cur.y >= 0 && cur.x < gridRow && cur.y < gridCol && grid[cur.x][cur.y] == '1' && no_sam(&s, cur))
{
Push(&s, cur.x, cur.y, cur.di);
if (cur.di == 1)
{
cur.y++;
}
else if (cur.di == 2)
{
cur.x++;
}
else if (cur.di == 3)
{
cur.y--;
}
else if (cur.di == 4)
{
cur.x--;
}
}
while (s.size && s.arr[s.size - 1].count >= 4)
{
grid[s.arr[s.size - 1].x][s.arr[s.size - 1].y] = '0';
pop(&s);
}
if (s.size > 0)
{
if (s.arr[s.size - 1].di < 4)
(s.arr[s.size - 1].di)++;
else
(s.arr[s.size - 1].di) = 1;
(s.arr[s.size - 1].count)++;
cur.x = s.arr[s.size - 1].x;
cur.y = s.arr[s.size - 1].y;
cur.di = s.arr[s.size - 1].di;
}
}
}
int solve(char** grid, int gridRowLen, int* gridColLen) {
int i = 0;
int count = 0;
for (i; i < gridRowLen; i++)
{
int j = 0;
for (j; j < *gridColLen; j++)
{
if (grid[i][j] == '1')
{
count++;
dfs(grid, gridRowLen, *gridColLen, i, j);
}
}
}
return count;
}
三、拼三角
暴力枚举,减少大脑消耗,挽救脑细胞,6个循环(因为数据个数小可以这样写)
#include<iostream>
using namespace std;
int is_tra(long long a, long long b, long long c)
{
if (a + b <= c || a + c <= b || b + c <= a)
return 0;
else
return 1;
}
int main()
{
int n;
cin >> n;
while (n--)
{
long long arr[6] = { 0 };
long long a[6] = { 0 };
int i = 0;
for (i; i < 6; i++)
{
cin >> arr[i];
}
int m = 0;
int flag = 0;
for (m; m < 6; m++)
{
a[0] = arr[m];
int k = 0;
for (k; k < 6; k++)
{
if (k == m)
continue;
a[1] = arr[k];
int z = 0;
for (z; z < 6; z++)
{
if (z == m || z == k)
continue;
a[2] = arr[z];
int g = 0;
for (g; g < 6; g++)
{
if (g == m || g == k || g == z)
continue;
a[3] = arr[g];
int f = 0;
for (f; f < 6; f++)
{
if (f == m || f == k || f == z || f == g)
continue;
a[4] = arr[f];
int d = 0;
for (d; d < 6; d++)
{
if (d == m || d == k || d == z || d == f || d == g)
continue;
a[5] = arr[d];
if (is_tra(a[0], a[1], a[2]) && is_tra(a[3], a[4], a[5]))
{
flag = 1;
break;
}
}
if (flag)
break;
}
if (flag)
break;
}
if (flag)
break;
} if (flag)
break;
}
if (flag)
break;
}
if (flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}