Leetcode-266周赛
01 - 字符串中的最大奇数
这题比较基础,找到最靠后的一个奇数输出就可以了
class Solution {
public:
string largestOddNumber(string num) {
if(num.empty()) return "";
for(int i = num.size() - 1; i >= 0; i--)
{
if((num[i] - '0') & 1) return num.substr(0, i + 1);
}
return "";
}
};
02 - 你完成的完整对局数
这题有两个很重要学到的点,一个是字符串格式化输入输出sscanf sprintf
这两个函数怎么用(很常用!)
还有就是上取整下取整别忘了,这题都转化成分钟来做就可以了
最后,有可能有负一的情况,记得额外判断一下就就好
class Solution {
public:
int getMinute(string& time)
{
int x, y;
sscanf(time.c_str(), "%d:%d", &x, &y);
return x * 60 + y;
}
int numberOfRounds(string startTime, string finishTime) {
int startMinute = getMinute(startTime), finishMinute = getMinute(finishTime);
if(startMinute > finishMinute)
finishMinute += 24 * 60;
return max(0, (finishMinute) / 15 - (startMinute + 14) / 15);
}
};
03 - 统计子岛屿
这个题就在正常的dfs上 额外加了一个条件,探索到grid1为0,而grid2为1的时候不计数,但是仍要正常统计完
所以这里的处理就是额外增加了一个flag 去统计有没有上面这种情况发生,没有才统计一次
class Solution {
public:
int n, m;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
public:
bool dfs(int si, int sj, vector<vector<int>>& grid1, vector<vector<int>>& grid2)
{
grid2[si][sj] = 0;
bool flag = true;
for(int i = 0; i < 4; i++)
{
int x = si + dx[i], y = sj + dy[i];
if(x < 0 || x >= n || y < 0 || y >= m) continue;
if(grid2[x][y] == 0) continue;
if(grid1[x][y] == 0) flag = false;
if(!dfs(x, y, grid1, grid2)) flag = false;
}
return flag;
}
int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
n = grid1.size(), m = grid1[0].size();
int res = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(grid1[i][j] == 1 && grid2[i][j] == 1)
if(dfs(i, j, grid1, grid2)) res++;
return res;
}
};
04 - 查询差绝对值的最小值
这个题真的学到了,主要是从数据范围出发,如果没有数据都在[1, 100]
这个条件是无法摆脱双重循环枚举的,所以是o(n^2)
明天写
Last updated