2022.02.05刷题
270. 最接近的二叉搜索树值
int closestValue(TreeNode* root, double target) {
    int res = root->val;
    while(root){
        res = abs(root->val-target)<abs(res-target)?root->val:res;
        if(root->val>target) root = root->left; 
        else root=root->right;
    }
    return res;
}
342. 4的幂
bool isPowerOfFour(int n) {
    if(n<1) return false;
    if((n & -n)!=n) return false;
    int i = 0; 
    for(;(n>>i & 1) ==0;i++);
    return i%2 == 0;
}
401. 二进制手表
Q: 二进制手表需要几个数位?
__builtin_popcount可以统计二进制位数.- 这个题还可以枚举 位运算来做.
 
vector<string> readBinaryWatch(int turnedOn) {
    vector<string> ans;
    for(int i = 0 ;i<12;i++){
        for(int j = 0;j<60;j++){
            if (__builtin_popcount(i) + __builtin_popcount(j) == turnedOn) {
                ans.push_back(to_string(i) + ":" + (j < 10 ? "0" : "") + to_string(j));
            }
        }
    } 
    return ans;
}
408. 有效单词缩写
Q: 模拟题, 模拟单词缩写.
bool validWordAbbreviation(string word, string abbr) {
    int l = 0;
    for(int i = 0 ;i<word.size();i++){
        if(isdigit(abbr[l])){
            if(abbr[l]=='0') return false; 
            int len = 1;
            while(l+len < abbr.size() && isdigit(abbr[l+len])) len++;
            int num = atoi(abbr.substr(l,len).c_str());
            if(i+num>word.size()) return false;
            i+= num-1;
            l+= len;
            // cout<<l<<endl;
        }
        else if(l < abbr.size() && word[i] == abbr[l]) l++;
        else{
            cout<< word[i]<<abbr[l];
            return false;
        } 
    }
    cout<<l<<endl;
    if(l!=abbr.size()) return false;
    return true;
}
改正关键:
 改写遍历单词的缩写.
bool validWordAbbreviation(string word, string abbr) {
    int l = 0, num = 0;
    for(int i = 0; i < abbr.size(); i++){
        if(isdigit(abbr[i])) {
            if(num == 0 && abbr[i]=='0') return false; 
            num= num*10 + abbr[i]-'0'; 
        }else{
            l+=num;
            num = 0;
            if(l>= word.size() || abbr[i] != word[l++]) return false;
        }
    }
    return l + num == word.size(); // 这里 记得一定要加上num
}
422. 有效的单词方块
Q: 判断单词方块是否沿对角线对称.
bool validWordSquare(vector<string>& words) {
    for(int i = 0;i<words.size();i++){
        for(int j = 0;j<words[i].size();j++){
            if(j>= words.size() || i>=words[j].size() || words[i][j] != words[j][i]) return false;
        } 
    }
    return true;
}
157. 用 Read4 读取 N 个字符
Q: 什么鬼题目啊, 一直用指针...
507. 完美数
Q: 一个数是不是欧完全数.
bool checkPerfectNumber(int x) {
    unordered_map<int,int> prime;
    int num = x;
    for (int i = 2; i <= x / i; i++)
    {
        while (x % i == 0)
        {
            prime[i]++;
            x /= i;
        }
    }
    if (x != 1) prime[x]++;
    long long res = 1;
    for (auto [b,a] : prime)
    {
        cout<< b << ' '<<a<<endl;
        long long t = 1;
        while (a--)
        {
            t = b * t + 1;
        }
        res*= t;
        if(res>1e10)return false; 
    } 
    res -= num;
    cout<<res<<endl;
    return res == num;
}
直接模拟解法?
    bool checkPerfectNumber(int x) {
        if (x == 1) return false;
        long long ans = 1;
        for(int i = 2; i <= x/i; i++){
            if(x % i == 0) {
                ans += i;
                if(i * i != x) ans += x / i;
            }
        } 
        cout << ans << endl;
        return ans == x; 
    }
599. 两个列表的最小索引总和
Q: 两个列表中共同量的最小索引是多少.
A: 直接进行模拟就行.
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
    unordered_map<string, int> um; 
    for(int i = 0; i < list1.size(); i++){
        um[list1[i]] = i;
    }
    int res = INT_MAX;
    vector<string> ans;
    for(int i = 0; i < list2.size(); i++){
        if(um.count(list2[i])){
            auto j = list2[i];
            if (um[j] + i < res) {
                ans.clear();
                ans.push_back(j);
                res = um[j] + i;
            }
            else if(um[j] + i == res) {
                ans.push_back(j); 
            }
        }
    }  
    return ans; 
}
604. Design Compressed String Iterator
A:这种题目 建议是 初始pos设在 0 上, 处理完一个以后, pos 直接往后加, 但是留上cnt的余量出来

                
            
        
浙公网安备 33010602011771号