力扣题目训练(9)

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
难度: 简单
题目:
力扣题目训练(9)_第1张图片

运行示例:
力扣题目训练(9)_第2张图片

思路:
这就是一个简单的遍历,只要按要求把特定位置进行修改即可。
代码:

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. 第三大的数

链接: 第三大的数
难度: 简单
题目:
力扣题目训练(9)_第3张图片

运行示例:
力扣题目训练(9)_第4张图片

思路:
求第三大就是排序然后返回位置第三的数字,不过需要删除重复元素,而且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. 字符串相加

链接: 字符串相加
难度: 简单
题目:
力扣题目训练(9)_第5张图片

运行示例:
力扣题目训练(9)_第6张图片
思路:
遍历然后按照行列式的方法逐位计算。
代码:

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. 求根节点到叶节点数字之和

链接: 数字之和
难度: 中等
题目:
力扣题目训练(9)_第7张图片

运行示例:
力扣题目训练(9)_第8张图片

思路:
这道题求叶子节点数字之和利用深度优先遍历完成。
代码:

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. 分割回文串

链接: 分割回文串
难度: 中等
题目:
力扣题目训练(9)_第9张图片

运行示例:
力扣题目训练(9)_第10张图片

思路:
分割回文可以看出需要利用回溯,而判断是否为回文可以利用动态规划判断。
代码:

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. 有效数字

链接: 有效数字
难度: 困难
题目:
力扣题目训练(9)_第11张图片

运行示例:
力扣题目训练(9)_第12张图片

思路:
这道题就是按照要求判断只需根据条件一步一步进行判断即可。
代码:

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;
    }
};

你可能感兴趣的:(编程学习,leetcode,算法,c++)