Go Java算法猜数字游戏示例详解
猜数字游戏
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls",公牛),
有多少位属于数字猜对了但是位置不对(称为 "Cows",奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。
提示的格式为 "xAyB" ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。
请注意秘密数字和朋友猜测的数字都可能含有重复数字。
- 示例 1:
输入:secret = "1807", guess = "7810"
输出:"1A3B"
- 示例 2:
输入:secret = "1123", guess = "0111"
输出:"1A1B"
提示:
1 <= secret.length, guess.length <= 1000
secret.length == guess.length
secret 和 guess 仅由数字组成
方法一:遍历(Java)
根据题意,对于公牛,需要满足数字和确切位置都猜对。我们可以遍历 secret 和 \textit{guess}guess,统计满足 secret[i]=guess[i] 的下标个数,即为公牛的个数。
对于字符相同的位置,我们可以直接对 a 进行自增;
对于字符不同的位置,使用「哈希表」进行分别统计 secret 和 guess 的词频,某个数字 x 在两者词频中的较小值,即为该数字对应的奶牛数量,统计所有数字 [0,9] 的奶牛数量总和即为 b。
class Solution {
public String getHint(String secret, String guess) {
int bulls = 0;
int[] cntS = new int[10];
int[] cntG = new int[10];
for (int i = 0; i < secret.length(); ++i) {
if (secret.charAt(i) == guess.charAt(i)) {
++bulls;
} else {
++cntS[secret.charAt(i) - '0'];
++cntG[guess.charAt(i) - '0'];
}
}
int cows = 0;
for (int i = 0; i < 10; ++i) {
cows += Math.min(cntS[i], cntG[i]);
}
return Integer.toString(bulls) + "A" + Integer.toString(cows) + "B";
}
}
时间复杂度O(N), N为secret长度
空间复杂度O(C), C为字符集大小
方法一:遍历(Go)
具体的方法思路表述已经在上文中详细说明了,详情请看上文内容。
遍历的时候,将匹配的直接计入公牛。不匹配的需要统计完全部数字,再根据相同的数字个数计算奶牛。
func getHint(secret string, guess string) string {
bows, cows, cntsS, cntsG := 0, 0, map[rune]int{}, map[rune]int{}
for i, k := range secret {
if g := rune(guess[i]); g == k {
bows++
} else {
cntsS[k]++
cntsG[g]++
}
}
for k, v := range cntsS {
if vg := cntsG[k]; vg >= v {
cows += v
} else {
cows += vg
}
}
return strconv.Itoa(bows) + "A" + strconv.Itoa(cows) + "B"
}
时间复杂度O(N), N为secret长度
空间复杂度O(C), C为字符集大小
以上就是Go Java算法猜数字游戏示例详解的详细内容,更多关于Go Java算法猜数字游戏的资料请关注脚本之家其它相关文章!
相关文章
BeanUtils.copyProperties使用总结以及注意事项说明
这篇文章主要介绍了BeanUtils.copyProperties使用总结以及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
spring boot使用properties定义短信模板的方法教程
这篇文章主要给大家介绍了关于spring boot使用properties定义短信模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-01-01
SpringBoot集成Druid配置(yaml版本配置文件)详解
这篇文章主要介绍了SpringBoot集成Druid配置(yaml版本配置文件),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12
idea pom导入net.sf.json的jar包失败的解决方案
JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式,这篇文章主要介绍了idea pom导入net.sf.json的jar包失败的解决方案,感兴趣的朋友一起看看吧2023-11-11
Springboot整合Java DL4J实现交通标志识别系统全过程
在自动驾驶系统中,交通标志识别是实现车辆智能化的关键技术之一,本文介绍了利用SpringBoot和JavaDeeplearning4j构建交通标志识别系统的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下2024-10-10


最新评论