2024年2月2日力扣题目训练
- 2024年2月2日力扣题目训练
- 412. Fizz Buzz
- 414. 第三大的数
- 415. 字符串相加
- 129. 求根节点到叶节点数字之和
- 131. 分割回文串
- 65. 有效数字
2024年2月2日力扣题目训练
2024年2月2日第九天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。
412. Fizz Buzz
链接: Fizz Buzz
难度: 简单
题目:
运行示例:
思路:
这就是一个简单的遍历,只要按要求把特定位置进行修改即可。
代码:
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string> ans;
for(int i = 0 ; i < n; i++){
if((i+1)%3 == 0 && (i+1)%5 == 0){
ans.push_back("FizzBuzz");
}else if((i+1)%3 == 0 && (i+1)%5 != 0){
ans.push_back("Fizz");
}else if((i+1)%3 != 0 && (i+1)%5 == 0){
ans.push_back("Buzz");
}else{
ans.push_back(to_string(i+1));
}
}
return ans;
}
};
414. 第三大的数
链接: 第三大的数
难度: 简单
题目:
运行示例:
思路:
求第三大就是排序然后返回位置第三的数字,不过需要删除重复元素,而且sort是从小到大排序的,这些细节都需要注意和解决。
代码:
class Solution {
public:
int thirdMax(vector<int>& nums) {
sort(nums.begin(),nums.end());
auto it = std::unique(nums.begin(), nums.end());
nums.erase(it, nums.end());
for(int i = 0; i < nums.size(); i++){
cout<<nums[i]<<endl;
}
return nums.size() >= 3? nums[nums.size()-3]:nums[nums.size()-1];
}
};
415. 字符串相加
链接: 字符串相加
难度: 简单
题目:
运行示例:
思路:
遍历然后按照行列式的方法逐位计算。
代码:
class Solution {
public:
string addStrings(string num1, string num2) {
string ans="";
int i = num1.size()-1;
int j = num2.size()-1;
int flag = 0;
while(i >= 0 || j >= 0 || flag != 0){
int x = i >= 0? (num1[i] - '0') : 0;
int y = j >= 0? (num2[j] - '0') : 0;
int temp = x+ y + flag;
if(temp >= 10){
temp -= 10;
flag = 1;
}else{
flag = 0;
}
ans += to_string(temp);
i--;
j--;
}
reverse(ans.begin(), ans.end());
return ans;
}
};
129. 求根节点到叶节点数字之和
链接: 数字之和
难度: 中等
题目:
运行示例:
思路:
这道题求叶子节点数字之和利用深度优先遍历完成。
代码:
class Solution {
public:
int dfs(TreeNode* root,int ans){
if(root == NULL) return 0;
ans = ans * 10 + (root->val);
if(root->left == NULL && root->right == NULL ){
return ans;
}
return dfs(root->left,ans) + dfs(root->right,ans);
}
int sumNumbers(TreeNode* root) {
return dfs(root,0);
}
};
131. 分割回文串
链接: 分割回文串
难度: 中等
题目:
运行示例:
思路:
分割回文可以看出需要利用回溯,而判断是否为回文可以利用动态规划判断。
代码:
class Solution {
private:
vector<vector<string>> ans;
vector<string> res;
int n;
public:
void dfs(string s, int i, vector<vector<bool>> f){
if(i == n){
ans.push_back(res);
return;
}
for(int j = i; j < n; j++){
if(f[i][j]){
res.push_back(s.substr(i,j-i+1));
dfs(s,j+1,f);
res.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
n = s.size();
vector<vector<bool>> f(n,vector<bool>(n,true));
for(int i = n -1; i >= 0; i--){
for(int j = i + 1; j < n; j++){
f[i][j] = (s[i] == s[j]) && f[i+1][j-1];
}
}
dfs(s,0,f);
return ans;
}
};
65. 有效数字
链接: 有效数字
难度: 困难
题目:
运行示例:
思路:
这道题就是按照要求判断只需根据条件一步一步进行判断即可。
代码:
class Solution {
public:
bool isNumber(string s) {
bool isNum = false;
bool isDecimal = false;
bool isE = false;
bool isSign = false;
for(int i = 0; i < s.size(); i++){
char temp = s[i];
if(0 <= temp-'0' && temp-'0'<= 9){
isNum = true;
}else if( temp == '.'){
if(isDecimal || (!isNum && i == s.size() - 1) || isE) return false;
isDecimal = true;
}else if(temp == 'e' || temp == 'E'){
if(isE || !isNum || i == s.size() - 1) return false;
isE = true;
}else if(temp == '-' || temp == '+'){
if((i > 0 && s[i-1] != 'e' && s[i-1] != 'E') || i == s.size() - 1) return false;
isSign = true;
}else{
return false;
}
}
return true;
}
};