題目大意:有一串隱藏的號碼,另外一我的會猜一串號碼(數目相同),若是號碼數字與位置都對了,給一個bull,數字對但位置不對給一個cow,注:數字對與位置對優先,一個號碼不能重複判斷.git
思路:構造map結構,遍歷實現code
Java實現:實現的不漂亮,好歹能經過ip
public String getHint(String secret, String guess) { Map<Character, Index> map = new HashMap<>(); for (int i=0; i<secret.length(); i++) { Index idx = map.get(secret.charAt(i)); if (idx == null) { idx = new Index(); map.put(secret.charAt(i), idx); } idx.add(i); } int bulls = 0; int cows = 0; List<Character> cowsList = new ArrayList<>(); // for count cows // count bulls for (int i=0; i<guess.length(); i++) { Index idx = map.get(guess.charAt(i)); if (idx != null) { // check digits if (idx.isBull(i)) { bulls++; } else { cowsList.add(guess.charAt(i)); } } } // count cows for (char c : cowsList) { Index idx = map.get(c); if (idx.isCow()) { cows++; } } return bulls + "A" + cows + "B"; } class Index { List<Integer> idxList; int count; // constructor public Index() { idxList = new ArrayList<>(); count = 0; } void add(int x) { idxList.add(x); count++; } boolean isCow() { return count-- > 0; } boolean isBull(int x) { for (int tmp : idxList) { if (x == tmp) { count--; return true; } } return false; } }
https://leetcode.com/problems/bulls-and-cows/discuss/74621/One-pass-Java-solutionleetcode
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"; }
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++) { if (secret.charAt(i) == guess.charAt(i)) bulls++; else { if (numbers[secret.charAt(i)-'0']++ < 0) cows++; if (numbers[guess.charAt(i)-'0']-- > 0) cows++; } } return bulls + "A" + cows + "B"; }