Skip to content

Commit 0c30114

Browse files
Create 299. 猜数字游戏.md
1 parent f50b4ba commit 0c30114

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

Hash Table/299. 猜数字游戏.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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

Comments
 (0)