19/06/30
猜数字游戏
猜数字
题目意思大概是两列长度相等的数列,如果第一位称为secret,第二列叫guess,如果对$i \in \{0, … ,secret.length\}$,有$secret[i] = guess[i]$称之为公牛,此时的i记录在公牛集$BullSet$中,有$secret[j] \in guess \land j \notin BullSet \land j \notin CowSet$,称之为奶牛,此时的j记录在奶牛集$CowSet$中。
简单描述题目基本已经把解法说清楚了,模拟即可,一下是模拟的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public String getHint(String secret, String guess) { char[] secretArray = secret.toCharArray(); char[] guessArray = guess.toCharArray(); HashSet<Integer> A = new HashSet<>(); HashSet<Integer> B = new HashSet<>();
int i = 0; while (i < guessArray.length) {
if (guessArray[i] == secretArray[i]) { A.add(i); } i++; }
for (int j = 0; j < guessArray.length; j++) { if (A.contains(j)) { continue; } for (int k = 0; k < secretArray.length; k++) { if (!A.contains(k) && !B.contains(k) && guessArray[j] == secretArray[k]) { B.add(k); break; } } }
return String.format("%dA%dB", A.size(), B.size()); }
|
很容易理解但是占内存又大时间又久,下面学习一下一个比较快而且很巧妙的解法,copy from the solution。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public String getHint(String secret, String guess) { int[] ab = new int[2]; int n = secret.length(); int[] cnt = new int[10]; for (int i = 0; i < n; ++i) { char s = secret.charAt(i); char g = guess.charAt(i); if (s == g) { ab[0]++; continue; } cnt[s - '0']++; }
for (int i = 0; i < n; ++i) { char s = secret.charAt(i); char g = guess.charAt(i); if (s != g && cnt[g - '0'] > 0) { cnt[g - '0']--; ab[1]++; } } return ab[0] + "A" + ab[1] + "B"; }
|