?LeetCode刷題實(shí)戰(zhàn)299:猜數(shù)字游戲

你寫(xiě)出一個(gè)秘密數(shù)字,并請(qǐng)朋友猜這個(gè)數(shù)字是多少。
朋友每猜測(cè)一次,你就會(huì)給他一個(gè)提示,告訴他的猜測(cè)數(shù)字中有多少位屬于數(shù)字和確切位置都猜對(duì)了(稱(chēng)為“Bulls”, 公牛),有多少位屬于數(shù)字猜對(duì)了但是位置不對(duì)(稱(chēng)為“Cows”, 奶牛)。
朋友根據(jù)提示繼續(xù)猜,直到猜出秘密數(shù)字。
xA 表示有 x 位數(shù)字出現(xiàn)在秘密數(shù)字中,且位置都與秘密數(shù)字一致。
yB 表示有 y 位數(shù)字出現(xiàn)在秘密數(shù)字中,但位置與秘密數(shù)字不一致。
示例
示例 1:
輸入: secret = "1807", guess = "7810"
輸出: "1A3B"
解釋: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。
示例 2:
輸入: secret = "1123", guess = "0111"
輸出: "1A1B"
解釋: 朋友猜測(cè)數(shù)中的第一個(gè) 1 是公牛,第二個(gè)或第三個(gè) 1 可被視為奶牛。
解題
class Solution {
public String getHint(String secret, String guess) {
char[] arrSecret = secret.toCharArray(); //把secret字符串轉(zhuǎn)化為arrSecret字符串?dāng)?shù)組
char[] arrGuess = guess.toCharArray(); //把secret字符串轉(zhuǎn)化為arrGuess字符串?dāng)?shù)組
int[] arrNumber = new int[10]; //數(shù)組下標(biāo)代表出現(xiàn)的數(shù),數(shù)組值表示出現(xiàn)的次數(shù)
int n = secret.length();
int number = -1;
int x = 0, y = 0; //x表示公牛數(shù)量,y表示奶牛數(shù)量
for (int i = 0; i < n; i++){ //第一遍遍歷找公牛
if (arrSecret[i] == arrGuess[i]){ //判斷公牛條件
x++;
}
number = Integer.parseInt(String.valueOf(arrSecret[i])); //將char型值轉(zhuǎn)換為int類(lèi)型
arrNumber[number]++; //數(shù)字number出現(xiàn)次數(shù)++
}
for (int i = 0; i < n; i++){ //第二遍遍歷找字符串中的重復(fù)值(公牛+奶牛)
number = Integer.parseInt(String.valueOf(arrGuess[i]));
if (arrNumber[number] > 0){ // >0代表secret中該number有多個(gè),找到一個(gè)減一個(gè)
arrNumber[number]--;
y++; //公牛+奶牛
}
}
y = y-x; //奶牛
return x + "A" + y + "B";
}
}
