leetcode打卡——299. 猜数字游戏(求交集or标记法)

题目


oj平台

题目解析

  • 题目有两种思路:
  1. 直接计算两个字符串的各个字母的出现频次,把位置相同得到res1(不计算在内),然后求两者的交集(最小值)即为res2。
  2. 直接遍历两次,第一次求res1,第二次求res2,第一次用不可能的字符进行标记,方便第二次识别。

解题代码

法一

class Solution {
    
    
public:
    string getHint(string secret, string guess) {
    
    
        int bulls = 0;
        vector<int> cntS(10), cntG(10);
        for (int i = 0; i < secret.length(); ++i) {
    
    
            if (secret[i] == guess[i]) {
    
    
                ++bulls;
            } else {
    
    
                ++cntS[secret[i] - '0'];
                ++cntG[guess[i] - '0'];
            }
        }
        int cows = 0;
        for (int i = 0; i < 10; ++i) {
    
    
            cows += min(cntS[i], cntG[i]);
        }
        return to_string(bulls) + "A" + to_string(cows) + "B";
    }
};

法二

class Solution {
    
    
public:
    string getHint(string secret, string guess) {
    
    
        //每次扫出答案后,把它们用记号替代
        int res1=0,res2=0;
        int n = secret.size();
        for(int i=0;i<n;i++){
    
    //第一遍扫出res1,并更改值为'_'
            if(secret[i]==guess[i]){
    
    
                res1++;
                secret[i] = '_';
            }
        }
        for(int i=0;i<n;i++){
    
    //第二遍扫除res2,并更改值为'*'
            if(secret[i]=='_')
            continue;
            int j = secret.find(guess[i]);
            if(j!=-1){
    
    
                res2++;
                secret[j] = '*';
            }
        }
    return to_string(res1)+"A"+to_string(res2)+"B";
    }
};

猜你喜欢

转载自blog.csdn.net/m0_50945504/article/details/121214134