---
# System prepended metadata

title: 'LeetCode #299 [Bulls and Cows](https://leetcode.com/problems/bulls-and-cows)'
tags: [LeetCode, Medium]

---

###### tags: `LeetCode` `Medium`
# LeetCode #299 [Bulls and Cows](https://leetcode.com/problems/bulls-and-cows)
### (Medium)
你在和朋友一起玩 猜數字（Bulls and Cows）遊戲，該遊戲規則如下：
你寫出一個秘密數字，並請朋友猜這個數字是多少。
朋友每猜測一次，你就會給他一個提示，告訴他的猜測數字中有多少位屬於數字和確切位置都猜對了（稱為“Bulls”, 公牛），有多少位屬於數字猜對了但是位置不對（稱為“Cows”, 奶牛）。
朋友根據提示繼續猜，直到猜出秘密數字。
請寫出一個根據秘密數字和朋友的猜測數返回提示的函數，返回字符串的格式為 xAyB ，x 和 y 都是數字，A 表示公牛，用 B 表示奶牛。
xA 表示有 x 位數字出現在秘密數字中，且位置都與秘密數字一致。
yB 表示有 y 位數字出現在秘密數字中，但位置與秘密數字不一致。
請注意秘密數字和朋友的猜測數都可能含有重複數字，每位數字只能統計一次。


---
先計算全部位置相同且數字相同的個數(A), 再計算猜測與答案中0-9的分別個數, 並且將猜測與答案的0-9的個數中較小的數(也就是兩者相同的0-9個數)加總並且減去A的個數即得B的個數。 回傳幾A幾B。
```
class Solution {
public:
    string getHint(string secret, string guess) {
        int counta = 0;
        int countb = 0;
        vector<int> s(10,0);
        vector<int> g(10,0);
        for(int i=0;i<secret.size();i++){
            if(secret[i]==guess[i])counta++;
            int is=secret[i]-'0';
            int ig=guess[i]-'0';
            s[is]++;
            g[ig]++;
        }
        for(int i=0;i<10;i++){
            countb+=min(s[i],g[i]);
        }
        return to_string(counta)+"A"+to_string(countb-counta)+"B";
    }
};
```

---
