力扣第299题“猜数字游戏”的解题思路

参考代码:

class Solution {
    public String getHint(String secret, String guess) {
        int[] nums = new int[10];
        int m=0,n=0;
        for(int i=0;i<guess.length();i++){
            if(secret.charAt(i)==guess.charAt(i)){
                m++;
            }
            else{
                if(nums[guess.charAt(i)-'0'] > 0) n++;
                   nums[guess.charAt(i)-'0']--;
                
                if(nums[secret.charAt(i)-'0'] < 0) n++; 
                   nums[secret.charAt(i)-'0']++;
            }
        }
        String s=m+"A"+n+"B";
        return s;
    }
}

大致思路:先确定公牛的数量,即二者在相同的位置的数也相等,这个很好统计,主要是奶牛的数量,公牛的else就是不在相同的位置,满足奶牛的一个条件,另一个条件就是找到相等的数,可以这样思考

创建一个0-9有10个数的数组,其初始值都为0,先让guess第i个数字对应的数组中的那个下标数减一,即表明在guess中出现就减一,在secret中出现就加一,同时能进入if语句说明在secret中出现过或者在guess中出现过,并且在不同的位置,这时就应该n++,统计奶牛的数目。这里有点难懂,需要多思考思考。

例:

secret = "1123", guess = "0111"

首先guess中的0与secret中的1不同,进入else语句,nums[0]=0(guess.charAt(i)-'0'就是guess中的第一个数0)

不满足条件,继续到nums[guess.charAt(i)-'0']--;此时nums[0]=-1

继续向下,secret第一个数是1,所以nums[1]=0,不满足条件,继续到nums[secret.charAt(i)-'0']++;此时nums[1]=1;

继续向下,到各自的第二个数,guess中为1,secret中为1,满足公牛的条件,m++,m=1,继续向下到第三个数,guess中为1,secret中为2,进入else语句中

nums[1]=1>0进入if语句,n++,n=1,继续向下,此时nums[1]=0;

继续向下,nums[2]=0,无法进入if语句,继续向下,nums[2]=1

到第四个数,guess中为1,secret中为3,进入else语句

nums[1]=0,继续向下,nums[1]=-1

nums[3]=0,继续向下,nums[3]=1

结束循环,1A1B

具体实现:

首先创建一个数组,在for循环中统计公牛与奶牛的数量

if(secret.charAt(i)==guess.charAt(i)){
                m++;
            }

这个是统计公牛的数量,在相同位置有相同的数

if(nums[guess.charAt(i)-'0'] > 0) n++;
                   nums[guess.charAt(i)-'0']--;
                
                if(nums[secret.charAt(i)-'0'] < 0) n++; 
                   nums[secret.charAt(i)-'0']++;

这个是统计奶牛的数量,因为默认的数组中的所有都为初始值0,给guess中每个数字都记在数组中,secret中一旦出现相同的数字就会找到已经被标记的数字(在数组中的值小于0),并通过加一抵消一个已经找到的相匹配的数,这里还是有点绕,建议结合上述例子看题目。

猜你喜欢

转载自blog.csdn.net/weixin_63994459/article/details/123539319