我一直在爲最後一天的LeetCode 'Bulls & Cows'挑戰而苦苦掙扎。我是學習算法過程的前端開發人員,並且很難理解Java中實現的一塊邏輯並將其移植到我的JavaScript解決方案中。JavaScript中的公牛和奶牛
public String getHint(String secret, String guess) {
int bulls = 0;
int cows = 0;
int[] numbers = new int[10];
for (int i = 0; i<secret.length(); i++) {
int s = Character.getNumericValue(secret.charAt(i));
int g = Character.getNumericValue(guess.charAt(i));
if (s == g) bulls++;
else {
if (numbers[s] < 0) cows++;
if (numbers[g] > 0) cows++;
numbers[s] ++;
numbers[g] --;
}
}
return bulls + "A" + cows + "B";
}
具體我有困難的時候認識的功能如下塊:
else {
if (numbers[s] < 0) cows++;
if (numbers[g] > 0) cows++;
numbers[s] ++;
numbers[g] --;
}
這裏是我的JS解決方案,我已經得到的是通過所有的(知)除secret = 1807
和guess = 7810
之外的測試用例:
var getHint = function(secret, guess) {
var bulls = 0;
var cows = 0;
var nums = [];
var checkNums = function(num) {
if(nums.length) {
for (var l = 0; l < nums.length; l++) {
if(num === nums[l]) {
return false;
} else {
nums.push(num);
cows++;
return true;
}
} else {
// /nums/ is equal to 0
cows++;
nums.push(num);
}
}
};
if(guess) {
// iterate over the secret to compare it to the guess
for (var i = 0; i < secret.length; i++) {
// compare the related location to check for bulls
if(secret[i] === guess[i]) {
bulls++;
nums.push(guess[i]);
} else {
// We didnt find a bull, lets check the /guess/ for cows
for(var j = 0; j < guess.length; j++) {
// We have a match, what should we do with it?
if (secret[i] === guess[j]) {
checkNums(guess[j]);
}
}
}
}
}
return bulls + "A" + cows + "B";
};
失敗的測試情況下,我得到的是:
Input:
"1807"
"7810"
Output:
"1A2B"
Expected:
"1A3B"
我希望更好地瞭解我怎麼能複製優雅的Java解決方案更好,以及我可以做任何這方面JS的解決方案更簡潔(和工作)。我對此感到越震心,更多for
循環和if
塊我寫了,我只知道我正在向錯誤的方向移動。
這裏是我的解決方案的JSBin:
http://jsbin.com/jibusa/edit?js,console
感謝您的任何幫助。
代碼有什麼問題?你有錯誤嗎?不正確的結果? –
@MarkC。更新的答案與來自LeetCode的失敗的測試案例響應。 – robabby
需要查看正在輸出什麼,以及應該輸出什麼_should_。 – CPerkins