diff --git a/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows.go b/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows.go new file mode 100644 index 00000000..920827f0 --- /dev/null +++ b/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows.go @@ -0,0 +1,31 @@ +package leetcode + +import "strconv" + +func getHint(secret string, guess string) string { + cntA, cntB := 0, 0 + mpS := make(map[byte]int) + var strG []byte + n := len(secret) + var ans string + for i := 0; i < n; i++ { + if secret[i] == guess[i] { + cntA++ + } else { + mpS[secret[i]] += 1 + strG = append(strG, guess[i]) + } + } + for _, v := range strG { + if _, ok := mpS[v]; ok { + if mpS[v] > 1 { + mpS[v] -= 1 + } else { + delete(mpS, v) + } + cntB++ + } + } + ans += strconv.Itoa(cntA) + "A" + strconv.Itoa(cntB) + "B" + return ans +} diff --git a/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows_test.go b/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows_test.go new file mode 100644 index 00000000..72028efb --- /dev/null +++ b/leetcode/0299.Bulls-and-Cows/299.Bulls and Cows_test.go @@ -0,0 +1,56 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question299 struct { + para299 + ans299 +} + +// para 是参数 +type para299 struct { + secret string + guess string +} + +// ans 是答案 +type ans299 struct { + ans string +} + +func Test_Problem299(t *testing.T) { + + qs := []question299{ + + { + para299{"1807", "7810"}, + ans299{"1A3B"}, + }, + + { + para299{"1123", "0111"}, + ans299{"1A1B"}, + }, + + { + para299{"1", "0"}, + ans299{"0A0B"}, + }, + + { + para299{"1", "1"}, + ans299{"1A0B"}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 299------------------------\n") + + for _, q := range qs { + _, p := q.ans299, q.para299 + fmt.Printf("【input】:%v 【output】:%v\n", p, getHint(p.secret, p.guess)) + } + fmt.Printf("\n\n\n") +} diff --git a/leetcode/0299.Bulls-and-Cows/README.md b/leetcode/0299.Bulls-and-Cows/README.md new file mode 100644 index 00000000..22bee1fc --- /dev/null +++ b/leetcode/0299.Bulls-and-Cows/README.md @@ -0,0 +1,77 @@ +# [299. Bulls and Cows](https://leetcode-cn.com/problems/bulls-and-cows/) + + +## 题目 + +You are playing the Bulls and Cows game with your friend. + +You write down a secret number and ask your friend to guess what the number is. When your friend makes a guess, you provide a hint with the following info: + +The number of "bulls", which are digits in the guess that are in the correct position. +The number of "cows", which are digits in the guess that are in your secret number but are located in the wrong position. Specifically, the non-bull digits in the guess that could be rearranged such that they become bulls. +Given the secret number secret and your friend's guess guess, return the hint for your friend's guess. + +The hint should be formatted as "xAyB", where x is the number of bulls and y is the number of cows. Note that both secret and guess may contain duplicate digits. + +**Example 1:** + +``` +Input: secret = "1807", guess = "7810" +Output: "1A3B" +Explanation: Bulls are connected with a '|' and cows are underlined: +"1807" + | +"7810" +``` + +**Example 2:** + +``` +Input: secret = "1123", guess = "0111" +Output: "1A1B" +Explanation: Bulls are connected with a '|' and cows are underlined: +"1123" "1123" + | or | +"0111" "0111" +Note that only one of the two unmatched 1s is counted as a cow since the non-bull digits can only be rearranged to allow one 1 to be a bull. +``` + +**Example 3:** + +``` +Input: secret = "1", guess = "0" +Output: "0A0B" +``` + +**Example 4:** + +``` +Input: secret = "1", guess = "1" +Output: "1A0B" +``` + +**Constraints:** + +- 1 <= secret.length, guess.length <= 1000 +- secret.length == guess.length +- secret and guess consist of digits only. + +## 题目大意 + +你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下: + +写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示: + +猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛), +有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 +给你一个秘密数字secret 和朋友猜测的数字guess ,请你返回对朋友这次猜测的提示。 + +提示的格式为 "xAyB" ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B表示奶牛。 + +请注意秘密数字和朋友猜测的数字都可能含有重复数字。 + +## 解题思路 + +- 计算下标一致并且对应下标的元素一致的个数,即x +- secret和guess分别去除x个公牛的元素,剩下secret和guess求共同的元素个数就是y +- 把x, y转换成字符串,分别与"A"和"B"进行拼接返回结果