2015-11-03 97 views
1

我一直在爲最後一天的LeetCode 'Bulls & Cows'挑戰而苦苦掙扎。我是學習算法過程的前端開發人員,並且很難理解Java中實現的一塊邏輯並將其移植到我的JavaScript解決方案中。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 = 1807guess = 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

感謝您的任何幫助。

+0

代碼有什麼問題?你有錯誤嗎?不正確的結果? –

+0

@MarkC。更新的答案與來自LeetCode的失敗的測試案例響應。 – robabby

+0

需要查看正在輸出什麼,以及應該輸出什麼_should_。 – CPerkins

回答

1

這是Java解決方案的虛擬副本。對JavaScript charCodeAt()的小調整是爲了解釋其與Java Character.getNumericValue的差異。

function getHint(secret, guess) { 
    var bulls = 0; 
    var cows = 0; 
    var numbers = new Array(10); 
    for (var i=0; i<10; i++){ 
    numbers[i] = 0; 
    } 
    for (var i = 0; i<secret.length; i++) { 
    var s = secret.charCodeAt(i) - 48; 
    var g = guess.charCodeAt(i) - 48; 
    if (s == g) bulls++; 
    else { 
     if (numbers[s] < 0) cows++; 
     if (numbers[g] > 0) cows++; 
     numbers[s] ++; 
     numbers[g] --; 
    } 
    } 
    return bulls + "A" + cows + "B"; 
} 

console.log(getHint("1807","7810")); 
+0

感謝您通過一個實例來回答。看到解決方案移植到JS確實讓它點擊。 – robabby

+0

謝謝,很高興它有幫助。 –

0

你爲什麼不這樣做?

var getHint = function(secret, guess) { 
    var bulls = 0; 
    var cows = 0; 
    var nums = []; 
    var length = 10; 
    var s; 
    var g; 
    for (var i2=0; i2 < length; i2++) {nums[i2] = 0;} 
    for (var i=0; i < secret.length; i++) { 
    s = Number(String(secret).charAt(i)); 
    g = Number(String(guess).charAt(i)); 

    if(s == g)bulls++; 
    else{ 
     if(nums[s] < 0)cows++; 
     if(nums[g] > 0) cows++; 
     nums[s]++; 
     nums[g]--; 

    } 
    } 
    return bulls + "A" + cows + "B"; 
}; 

console.log(getHint("1123", "0111")); 
console.log(getHint("1807", "7810")); 

輸出繼電器:

"1A1B" 
"1A3B" 
1

numbers[x]代表無與倫比x S在祕密和的前綴數量猜到目前爲止掃描。正數表示祕密中有盈餘。負數表示猜測中有盈餘。

碼塊

if (numbers[s] < 0) cows++; 
if (numbers[g] > 0) cows++; 
numbers[s] ++; 
numbers[g] --; 

轉換爲英語如下。如果s,祕密中的當前字母在猜測中有過剩,則它與猜測中的前一個字母匹配,因此增加牛的數量。如果g,猜測中的當前字母在祕密中有剩餘,則它匹配祕密中的前一個字母,因此增加牛的數量。 numbers[s] ++非常光滑:它可以消除猜測中的多餘信件或在祕密中創建一個盈餘。同樣,numbers[g] --或者刪除祕密中的多餘字母或者在猜測中創建一個。

+0

非常感謝您花時間解釋。這爲我揭開了邏輯的神祕面紗。 – robabby