2021.11.8LeetCode每日一题——猜数字游戏

目录

猜数字游戏

描述

示例 1

示例 2

示例 3

示例 4

提示

方法一:哈希集合

方法二:数组


扫描二维码关注公众号,回复: 13233498 查看本文章

猜数字游戏

描述

你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:

写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:

  • 猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛),
  • 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。

给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。

提示的格式为 "xAyB" ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。

请注意秘密数字和朋友猜测的数字都可能含有重复数字。

示例 1

输入:secret = "1807", guess = "7810"
输出:"1A3B"

解释:数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。
"1807"
    |
"7810"

示例 2

输入:secret = "1123", guess = "0111"
输出:"1A1B"

解释:数字和位置都对(公牛)用 '|' 连接,数字猜对位置不对(奶牛)的采用斜体加粗标识。
"1123"        "1123"
    |         or     |
"0111"        "0111"
注意,两个不匹配的 1 中,只有一个会算作奶牛(数字猜对位置不对)。通过重新排列非公牛数字,其中仅有一个 1 可以成为公牛数字。

示例 3

输入:secret = "1", guess = "0"
输出:"0A0B"

示例 4

输入:secret = "1", guess = "1"
输出:"1A0B"

提示

  • 1 <= secret.length, guess.length <= 1000
  • secret.length == guess.length
  • secret 和 guess 仅由数字组成

方法一:哈希集合

我们首先遍历一遍,找到所有公牛元素,即位置和值都正确的个数,然后将secret的其他元素放到列表中,将guess的剩下字符放到map集合中。

接着我们遍历列表,在guess的剩下字符中找目标字符,找到了就删除guess中对应的字符,并且cows++

class Solution {
    public String getHint(String secret, String guess) {
        int countBulls=0,countCows=0;
        ArrayList<Character> listSecret=new ArrayList<>();
        HashMap<Character,Integer> mapGuess=new HashMap();
        for (int i = 0; i < secret.length(); i++) {
            if (secret.charAt(i)==guess.charAt(i)){//找出所有位置正确,数字不正确的元素个数
                countBulls++;
            }else{
                listSecret.add(secret.charAt(i));//将不匹配的字符放入集合中
                mapGuess.put(guess.charAt(i),mapGuess.getOrDefault(guess.charAt(i),0)+1);
            }
        }

        for (Character c:listSecret) {
            if (mapGuess.containsKey(c)){
                countCows++;
                if (mapGuess.get(c)==1){
                    mapGuess.remove(c);//移除找到的元素
                }else{
                    mapGuess.put(c,mapGuess.getOrDefault(c,0)-1);
                }
            }
        }
        return countBulls+"A"+countCows+"B";
    }
}

方法二:数组

因为本题只涉及到数字,所以我们可以用长度为10的数组来模拟哈希集合。

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";
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/121201363