1. 程式人生 > >[Leetcode] 第299題 猜數字遊戲

[Leetcode] 第299題 猜數字遊戲

 

一、題目描述

請寫出一個根據祕密數字和朋友的猜測數返回提示的函式,用 A 表示公牛,用 B 表示奶牛。

請注意祕密數字和朋友的猜測數都可能含有重複數字。

示例 1:

輸入: secret = "1807", guess = "7810"

輸出: "1A3B"

解釋: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7

示例 2:

輸入: secret = "1123", guess = "0111"

輸出: "1A1B"

解釋: 朋友猜測數中的第一個 1 是公牛,第二個或第三個 1
 可被視為奶牛。

說明: 你可以假設祕密數字和朋友的猜測數都只包含數字,並且它們的長度永遠相等

二、題目分析

1)cnt1和cnt2分別代表A和B的數目

2)統計出secret中字元出現的次數mp1<char,int>,然後統計在guess和secret中同時出現但是位置不正確字元的出現次數map2<char,int>

三、程式碼實現

 1 class Solution {
 2 public:
 3     string getHint(string secret, string guess) {
 4         unordered_map<char
, int>mp1, mp2; 5 int cnt1 = 0, cnt2 = 0; 6 for (int i = 0; i < secret.size(); ++i) { 7 ++mp1[secret[i]]; 8 } 9 for (int i = 0; i < guess.size(); ++i) { 10 if (i < secret.size() && guess[i] == secret[i]) { 11 --mp1[secret[i]];
12 ++cnt1; 13 } 14 else if (mp1.find(guess[i]) != mp1.end()) { 15 ++mp2[guess[i]]; 16 } 17 } 18 for (auto it = mp2.begin(); it != mp2.end(); ++it) { 19 if (mp1[it->first] > 0)cnt2 += min(mp1[it->first], mp2[it->first]); 20 } 21 string res = itos(cnt1) + "A" + itos(cnt2) + "B"; 22 cout << endl; 23 return res; 24 } 25 private: 26 string itos(int x) { 27 stringstream is; 28 is << x; 29 string res; 30 is >> res; 31 return res; 32 } 33 };