2016-11-29 13 views
2

アルゴリズムはhttps://discuss.leetcode.com/topic/28463/one-pass-java-solutionです。leetcodeの雄牛と牛の説明

public static 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"; 
    } 

しかし、どのようにこの部分を理解するために:

numbers[s] ++; 
numbers[g] --; 

なぜそれが秘密でカウントするように推測し、正の数の発生をカウントするために負の数を使用しません。

+1

[++ i、i ++のプリプロイド/ポストインクリメントのJavaでの配列使用可能な複製](http://stackoverflow.com/questions/39809772/ii-pre-post-incrementation-usage-with-arrays-in) -java) –

+0

++ i/i ++演算子を理解するのに問題はありません。ポイントはここでなぜ「秘密」を増やし、「推測」を減らすかです。 – user697911

+0

アルゴリズムの一部について混乱がある場合は、「この部分を理解する方法」が重複して回答された質問のように思われるので、明示的に記述する方が良いでしょう –

答えて

1

numbersアレイは、2つの配列で見不一致数を追跡します。最初にnumbers配列の各エントリは0であり、どちらの配列にも数字が表示されていないことを示します。正のエントリは、guessアレイよりも多くの回数でsecretアレイに番号が見られたことを意味します。否定的なエントリは、guessアレイ内で数字がsecretアレイよりも多く見られたことを意味します。

アルゴリズムでsecret配列の数値が見つかると、numbers配列の対応するエントリが増加します。そのエントリがインクリメントされる前に負の値になった場合は、guessの配列に数字がすでに存在していることを意味します。したがって、cowsが増加します。

同様にアルゴリズムがguessアレイ内の数字を見ると、numbersアレイ内の対応するエントリが減少します。そのエントリがデクリメントの前に正に発生した場合は、secretアレイにすでに数が表示されていることを意味しているため、cowsが増加します。

関連する問題