299. 猜数字游戏
题目描述:
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
猜测数字中有多少位属于数字和确切位置都猜对了(称为 “Bulls”,公牛),
有多少位属于数字猜对了但是位置不对(称为 “Cows”,奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。
提示的格式为 “xAyB” ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。
请注意秘密数字和朋友猜测的数字都可能含有重复数字。
考察重点:以一个序数指针遍历两数组,当值相等则“公牛”+1;以一个map记录相同值不同位的情况,secret为其加一,guess为其减一,因此当值不为0时说明匹配成功,“奶牛”+1。
func getHint(secret string, guess string) string {nMap, sLen, aNum, bNum := make(map[int]int), len(secret), 0, 0 for x := sLen-1; x >= 0; { /**aNum记录两个数中,位数和值都相同的数量bNum记录两个数中,值相同但是位数不同的数量1807 7810aNum = 1 bNum = 3*/if secret[x] == guess[x] {aNum++} else {tempx, tempy := int(secret[x]-'0'), int(guess[x]-'0') //如果temp是guess中的数,则map--,否则map++if nMap[tempx] < 0 { //当temp是secret中,且map[temp]<0 说明匹配到了bNum++ //当temp是guess中,且map[temp]>0 说明匹配到了}nMap[tempx]++if nMap[tempy] > 0 {bNum++ //bNum不能等最后才加,因为当map[temp]=-1 我们不知道是加了一次减了两次 还是 减了一次}nMap[tempy]--}x--}return strconv.Itoa(aNum) + "A" + strconv.Itoa(bNum) + "B"
}