Go Java算法猜数字游戏示例详解

 更新时间:2022年08月20日 09:15:01   作者:黄丫丫  
这篇文章主要为大家介绍了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使用总结以及注意事项说明

    这篇文章主要介绍了BeanUtils.copyProperties使用总结以及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中超详细this与super的概念和用法

    Java中超详细this与super的概念和用法

    这篇文章主要介绍了Java中超详细this与super的概念和用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • spring boot使用properties定义短信模板的方法教程

    spring boot使用properties定义短信模板的方法教程

    这篇文章主要给大家介绍了关于spring boot使用properties定义短信模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • 全局请求添加TraceId轻松看日志

    全局请求添加TraceId轻松看日志

    这篇文章主要为大家介绍了全局请求添加TraceId,更加方便轻松的看日志,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • SpringBoot集成Druid配置(yaml版本配置文件)详解

    SpringBoot集成Druid配置(yaml版本配置文件)详解

    这篇文章主要介绍了SpringBoot集成Druid配置(yaml版本配置文件),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • idea pom导入net.sf.json的jar包失败的解决方案

    idea pom导入net.sf.json的jar包失败的解决方案

    JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式,这篇文章主要介绍了idea pom导入net.sf.json的jar包失败的解决方案,感兴趣的朋友一起看看吧
    2023-11-11
  • Springboot整合Java DL4J实现交通标志识别系统全过程

    Springboot整合Java DL4J实现交通标志识别系统全过程

    在自动驾驶系统中,交通标志识别是实现车辆智能化的关键技术之一,本文介绍了利用SpringBoot和JavaDeeplearning4j构建交通标志识别系统的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • 基于Java编写一个限流工具类RateLimiter

    基于Java编写一个限流工具类RateLimiter

    这篇文章主要为大家详细介绍了如何基于Java编写一个限流工具类RateLimiter,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • SpringBoot集成RbbitMQ队列踩坑记录

    SpringBoot集成RbbitMQ队列踩坑记录

    这篇文章主要介绍了SpringBoot集成RbbitMQ队列踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • SpringBoot3.x打包Docker容器的实现

    SpringBoot3.x打包Docker容器的实现

    这篇文章主要介绍了SpringBoot3.x打包Docker容器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论