導(dǎo) 題目: 你在和朋友一起玩 猜數(shù)字(Bulls and Cows)游戲,該游戲規(guī)則如下: 你寫出一個秘密數(shù)字,并請朋友猜這個數(shù)字是多少。 朋友每猜測一次,你就會給他一個提示,告訴他的猜測...

題目:

你在和朋友一起玩 猜數(shù)字(Bulls and Cows)游戲,該游戲規(guī)則如下:

你寫出一個秘密數(shù)字,并請朋友猜這個數(shù)字是多少。

朋友每猜測一次,你就會給他一個提示,告訴他的猜測數(shù)字中有多少位屬于數(shù)字和確切位置都猜對了(稱為“Bulls”, 公牛),有多少位屬于數(shù)字猜對了但是位置不對(稱為“Cows”, 奶牛)。

朋友根據(jù)提示繼續(xù)猜,直到猜出秘密數(shù)字。

請寫出一個根據(jù)秘密數(shù)字和朋友的猜測數(shù)返回提示的函數(shù),返回字符串的格式為 xAyB ,x 和 y 都是數(shù)字,A 表示公牛,用 B 表示奶牛。

xA 表示有 x 位數(shù)字出現(xiàn)在秘密數(shù)字中,且位置都與秘密數(shù)字一致。

yB 表示有 y 位數(shù)字出現(xiàn)在秘密數(shù)字中,但位置與秘密數(shù)字不一致。

請注意秘密數(shù)字和朋友的猜測數(shù)都可能含有重復(fù)數(shù)字,每位數(shù)字只能統(tǒng)計一次。

示例:

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

輸出: "1A1B"

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

思路:

遍歷字符串過程中,記錄A的個數(shù),同時記錄其他元素的出現(xiàn)次數(shù)。

對每個其他元素, secrect和guess中出現(xiàn)的最小次數(shù),就是該元素對應(yīng)的B的個數(shù)。

代碼:

class Solution {public: string getHint(string secret, string guess) { int n = secret.size(); int x=0; unordered_map<char, int> secret_map, guess_map; for(int i=0; i<n; i++) { if(secret[i] == guess[i]) x++; else { secret_map[secret[i]]++; guess_map[guess[i]]++; } } int y=0; for(auto& pair: guess_map) { auto itr = secret_map.find(pair.first); if(itr != secret_map.end()) { y+=min(pair.second, itr->second); } } ostringstream ss; ss << x << "A" << y << "B"; return ss.str(); }};