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

作者:黄丫丫 时间:2022-03-02 21:01:50 

猜数字游戏

你在和朋友一起玩 猜数字(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为字符集大小

来源:https://juejin.cn/post/7133605651984416782

标签:Go,Java,算法,猜数字,游戏
0
投稿

猜你喜欢

  • Java实现中英文词典功能

    2021-06-20 18:25:56
  • C#中分部类和分部方法的应用

    2022-08-16 06:49:05
  • java长整除问题浅谈

    2023-05-22 06:06:23
  • java验证电话号码的方法

    2023-04-01 21:44:41
  • 企业级Kubernetes管理平台Wayne功能特性介绍

    2021-11-05 08:58:33
  • Java项目中获取路径的绝对路径问题和相对路径问题

    2023-07-09 13:25:01
  • C#中字符串的加密的源码

    2023-09-14 22:35:34
  • Android自定义圆环倒计时控件

    2023-10-07 06:52:41
  • Android拼图游戏 玩转从基础到应用手势变化

    2021-08-24 02:41:59
  • Android Fragment滑动组件ViewPager的实例详解

    2022-06-10 05:23:10
  • Java中volatile关键字实现原理

    2023-09-30 14:20:58
  • java Wrapper类基本用法详解

    2022-12-20 18:20:05
  • 关于Android中ListView嵌套GridView的问题

    2023-09-16 10:56:39
  • SpringBoot启动访问localhost:8080报错404的解决操作

    2021-07-20 08:44:00
  • idea企业开发之新建各类型项目的详细教程

    2023-02-28 05:27:11
  • java中String的一些方法深入解析

    2023-11-25 21:48:56
  • java向多线程中传递参数的三种方法详细介绍

    2023-07-11 21:52:55
  • Java的封装类和装箱拆箱详解

    2023-09-20 22:41:22
  • Kafka 日志存储实现过程

    2021-11-01 05:04:00
  • Android编程实现分页加载ListView功能示例

    2023-11-13 06:27:27
  • asp之家 软件编程 m.aspxhome.com