【发布时间】:2015-11-04 05:19:24
【问题描述】:
最后一天,我一直在努力应对 LeetCode 'Bulls & Cows' 挑战。我是一名正在学习算法的前端开发人员,我很难理解用 Java 实现的逻辑块并将其移植到我的 JavaScript 解决方案中。
工作的Java Solution:
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 失败的测试用例响应的答案。
-
需要看看是在输出什么,应该输出什么。
-
+1 用于正确提出的问题。你展示了你做了什么以及你遇到了什么问题。现在,如果我的 javascript 不是那么差就好了。
-
啊,Mastermind!那个 jsbin 正在输出预期的
"1A0B"..?
标签: javascript java algorithm