猜数字游戏

94 阅读2分钟

题目描述

image.png 输出实例

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

在题目当中给的是一个字符串,而相对于奶牛而言公牛的求法思路很清晰

先定义两个计数器来记录公牛和奶牛的数量

同时遍历两个字符串中所有的字符进行比较,相等的话公牛计数器+1

对于奶牛来说首先肯定是在第一个条件判断错误的时候发生的那么我们可以在secret中寻找有没有这个字符符

for (int i = 0; i < len; i++) {
    if(secret.charAt(i)==guess.charAt(i)){
        buils++;
        continue;
    }else
   if(secret.contains(guess.charat(i)){
   cows++;
   continue;}

这是主要的代码体

但是当我们运行实例的时候发现错了!

对于实例的提示发现重复部分很难搞定,是指换到正确的位置的数字有多少个 也就是说两个字符串当中重复元素少的那一方才是可以移动数量.

为了记录每一个数字的重复度,我们可以用哈希表的方式去记录

定义两个长度为10的数组去取记录,数组索引表示重复的那个数

当第一个条件判断错的时候就将两个数组在该字符索引下++

当遍历完整个字符串的时候,再去遍历两个数组将它们在相同索引下的值进行比较 较小的那个数加进cows当中

ublic class tex9 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String secret=sc.nextLine();
        String guess= sc.nextLine();
        int len = guess.length();
        int cows=0,buils=0;
        int []cow=new int[10];
        int []buil=new int[10];
        for (int i = 0; i < len; i++) {
            if(secret.charAt(i)==guess.charAt(i)){
                buils++;
                continue;
            }
            else {
                ++cow[secret.charAt(i) - '0'];
                ++buil[guess.charAt(i) - '0'];

            }
        }
        for (int i = 0; i < 10; i++) {
            cows+=Math.min(cow[i],buil[i]);
        }
        System.out.println(buils+"A"+cows+"B");
    }
}