|
| 1 | +#### 299. 猜数字游戏 |
| 2 | + |
| 3 | +难度:中等 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +你在和朋友一起玩 [猜数字(Bulls and Cows)](https://baike.baidu.com/item/%E7%8C%9C%E6%95%B0%E5%AD%97/83200?fromtitle=Bulls+and+Cows&fromid=12003488&fr=aladdin)游戏,该游戏规则如下: |
| 8 | + |
| 9 | +写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示: |
| 10 | + |
| 11 | +* 猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls",公牛), |
| 12 | +* 有多少位属于数字猜对了但是位置不对(称为 "Cows",奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 |
| 13 | + |
| 14 | +给你一个秘密数字 `secret` 和朋友猜测的数字 `guess` ,请你返回对朋友这次猜测的提示。 |
| 15 | + |
| 16 | +提示的格式为 `"xAyB"` ,`x` 是公牛个数, `y` 是奶牛个数,`A` 表示公牛,`B` 表示奶牛。 |
| 17 | + |
| 18 | +请注意秘密数字和朋友猜测的数字都可能含有重复数字。 |
| 19 | + |
| 20 | + **示例 1:** |
| 21 | + |
| 22 | +``` |
| 23 | +输入:secret = "1807", guess = "7810" |
| 24 | +输出:"1A3B" |
| 25 | +解释:数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。 |
| 26 | +"1807" |
| 27 | + | |
| 28 | +"7810" |
| 29 | +``` |
| 30 | + |
| 31 | + **示例 2:** |
| 32 | + |
| 33 | +``` |
| 34 | +输入:secret = "1123", guess = "0111" |
| 35 | +输出:"1A1B" |
| 36 | +解释:数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。 |
| 37 | +"1123" "1123" |
| 38 | + | or | |
| 39 | +"0111" "0111" |
| 40 | +注意,两个不匹配的 1 中,只有一个会算作奶牛(数字猜对位置不对)。通过重新排列非公牛数字,其中仅有一个 1 可以成为公牛数字。 |
| 41 | +``` |
| 42 | + |
| 43 | + **提示:** |
| 44 | + |
| 45 | +* `1 <= secret.length, guess.length <= 1000` |
| 46 | +* `secret.length == guess.length` |
| 47 | +* `secret` 和 `guess` 仅由数字组成 |
| 48 | + |
| 49 | +--- |
| 50 | + |
| 51 | +哈希表: |
| 52 | + |
| 53 | +- 当前位置的字符不一致时,使用两个哈希表各自记录当前字符出现的次数,最后再比较两个哈希表中共同元素的最小值,。 |
| 54 | + |
| 55 | +- 当前位置的字符一致时,即为公牛的个数, |
| 56 | + |
| 57 | +```go |
| 58 | +func getHint(secret string, guess string) string { |
| 59 | + sz := len(secret) |
| 60 | + var countB, countC int |
| 61 | + arrayS, arrayG := make(map[byte]int), make(map[byte]int) |
| 62 | + for i := 0; i < sz; i++ { |
| 63 | + if secret[i] == guess[i] { |
| 64 | + countB++ |
| 65 | + } else { |
| 66 | + arrayS[secret[i]]++ |
| 67 | + arrayG[guess[i]]++ |
| 68 | + } |
| 69 | + } |
| 70 | + for k, v := range arrayS { |
| 71 | + countC += min(v, arrayG[k]) |
| 72 | + } |
| 73 | + return fmt.Sprintf("%dA%dB", countB, countC) |
| 74 | +} |
| 75 | +``` |
0 commit comments