第一题:6070. 计算字符串的数字和
solution: 模拟一遍
class Solution {
public:
string digitSum(string s, int k) {
if(s.size() <= k) return s; //结束递归
int n = s.size();
string res = ""; //定义返回值
int word = 0;
for(int i = 0;i < n;i++){
word += s[i] - '0';
if((i + 1) % k == 0){ //合并
res += to_string(word);
word = 0;
}
}
//处理末尾
if(n % k) res += to_string(word);
res = digitSum(res,k);
return res;
}
};
第二题 :6071. 完成所有任务需要的最少轮数
solution:
class Solution {
public:
int minimumRounds(vector<int>& tasks) {
int n = tasks.size();
sort(tasks.begin(),tasks.end()); //将任务排序,同一级别的会在一起
int res = 0; //定义返回值
for(int i = 0;i < n;i++){
int j = i;
while(j + 1< n && tasks[j + 1] == tasks[i]) j++;
int size = j - i + 1;
if(size == 1) return -1;
//分类讨论
else if(size % 3 == 0) res += size / 3;
else if(size % 3 == 1) res += (size - 4) / 3 + 2;
else{
res += size / 3 + 1;
}
i = j;
}
return res;
}
};
这题看的答案唉
class Solution {
public:
int getfactornum(int x,int factor){
int k = 0;
while(x % factor == 0){
x /= factor;
k++;
}
return k;
}
int maxTrailingZeros(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
vector<vector<int>> f2(n + 1),g2(n + 1),f5(n + 1),g5(n + 1);
for(int i = 0;i <= n;i++) f2[i] = g2[i] = f5[i] = g5[i] = vector<int>(m + 1); //建立n*m数组
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++){
int x = grid[i - 1][j - 1];
int two = 0,five = 0;
two = getfactornum(x,2);
five = getfactornum(x,5); //获取只由2或5组成的因子数
f2[i][j] = f2[i][j - 1] + two;
g2[i][j] = g2[i - 1][j] + two;
f5[i][j] = f5[i][j - 1] + five;
g5[i][j] = g5[i - 1][j] + five; //前缀和
}
int ans = 0;
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) {
// 从左边出发,到上边结束
ans = max(ans, min(f2[i][j] + g2[i - 1][j], f5[i][j] + g5[i - 1][j]));
// 从左边出发,到下边结束
ans = max(ans, min(f2[i][j] + g2[n][j] - g2[i][j], f5[i][j] + g5[n][j] - g5[i][j]));
// 从右边出发,到上边结束
ans = max(ans, min(f2[i][m] - f2[i][j] + g2[i][j], f5[i][m] - f5[i][j] + g5[i][j]));
// 从右边出发,到下边结束
ans = max(ans, min(f2[i][m] - f2[i][j] + g2[n][j] - g2[i - 1][j], f5[i][m] - f5[i][j] + g5[n][j] - g5[i - 1][j]));
}
return ans;
}
};
题目分析: 力扣
class Solution {
public:
vector<vector<int>> tree; //存储图
string s;
int ans = 0; //定义答案
int longestPath(vector<int>& parent, string e) {
int n = parent.size();
s = e;
tree.resize(n);
for(int i = 1;i < n;i++){
tree[parent[i]].push_back(i);
}
dfs(0);
return ans + 1;
}
int dfs(int u){ //返回以u为根节点的满足条件的深度
int maxlen = 0;
for(int &x : tree[u]){
int len = dfs(x) + 1;
if(s[x] != s[u]){ //相邻字母不同更新距离
ans = max(ans,maxlen + len);
maxlen = max(maxlen,len); //maxlen保存遍历过的节点的最长路径
}
}
return maxlen;
}
};