第一题:字符串中最大的3位相同的数字
思路:双指针+模拟
代码:
class Solution {
public:
string largestGoodInteger(string num) {
string s;
for(int i = 0; i < num.size(); i ++){
int j = i;
while(j < num.size() && num[i] == num[j]) j ++;
cout << j << " ";
if(j - i >= 3){
string temp;
for(int k = 0; k < 3; k ++) temp += num[i];
if(temp > s) s = temp;
cout << temp << endl;
}
i = j - 1;
}
return s;
}
};
第二题:统计值等于子树平均值的节点数
思路:模拟 + 递归
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//计算以该节点为根节点的树的所有节点的值的和
int getsum(TreeNode* root){
if(root == NULL) return 0;
return getsum(root->left) + getsum(root->right) + root->val;
}
//计算以该节点为根节点的树的所有节点数
int getn(TreeNode* root){
if(root == NULL) return 0;
return getn(root->left) + getn(root->right) + 1;
}
int getavern(TreeNode* root){
if(root == NULL) return 0;
return getavern(root->left) + getavern(root->right) + (getsum(root) / getn(root) == root->val);
}
int averageOfSubtree(TreeNode* root) {
return getavern(root);
}
};
第三题:统计打字方案数
思路:这题最难的部分是找出连续的数可以变换为不同的数字的方案数,看了题解发现是斐波那契数,其他的部分主要是一个双指针
代码:
class Solution {
public:
const int mod = 1e9 + 7, N = 1e5 + 10;
typedef long long LL;
int countTexts(string pressedKeys) {
int n = pressedKeys.size();
int f[N], g[N]; //f表示三个数,g表示四个数
f[0] = g[0] = 1, f[1] = g[1] = 1, f[2] = g[2] = 2, f[3] = g[3] = 4;
for(int i = 4; i < N; i ++) {
f[i] = ((LL)f[i - 1] + f[i - 2] + f[i - 3]) % mod;
g[i] = ((LL)g[i - 1] + g[i - 2] + g[i - 3] + g[i - 4]) % mod;
}
int res = 1;
for(int i = 0; i < n; i ++){
int j = i;
while(j < n && pressedKeys[i] == pressedKeys[j]) j ++;
int s = j - i;
if(pressedKeys[i] == '7' || pressedKeys[i] == '9') res = (LL)res * g[s] % mod;
else res = (LL)res * f[s] % mod;
i = j - 1;
}
return res;
}
};
第4题:检查是否有合法括号字符串路径
思路:dfs
代码:
class Solution {
public:
bool st[105][105][205];
bool hasValidPath(vector<vector<char>>& grid) {
int n = grid.size(), m = grid[0].size();
//当第一个为')'或者最后一个为'('都是不合法的,因为只能向下或者向右所以最后字符串的长度为n+m-1要使字符串合法字符串的长度一定为偶数
if((m + n - 1) & 1 || grid[0][0] == ')' || grid[n - 1][m - 1] == '(') return false;
//(x, y)为当前的坐标,z表示当前'('的个数
return dfs(grid, 0, 0, 0);
}
bool dfs(vector<vector<char>>& grid, int x, int y, int z){
int n = grid.size(), m = grid[0].size();
if(x == n - 1 && y == m - 1) return z == 1;
//当z<0或者z大于之后的长度时,这个字符串是不合法的
if(z < 0 || z > n - x + m - y - 1 || st[x][y][z]) return false;
st[x][y][z] = true;
z += (grid[x][y] == ')')?-1:1;
return (x < n - 1 && dfs(grid, x + 1, y, z)) || (y < m - 1 && dfs(grid, x, y + 1, z));
}
};