LeetCode 299 猜数字游戏

1.自己的做法

class Solution {
    public String getHint(String secret, String guess) {
        int a=0,b=0;
        char[] sc = secret.toCharArray();
        char[] gs = guess.toCharArray();
        for(int i=0;i<gs.length;i++){
            if(gs[i] == sc[i]){
                a++;
                sc[i]='A';
            }
        }
        for(int i=0;i<gs.length;i++){
            if(sc[i] != 'A'){
                for(int j=0;j<sc.length;j++){
                    if(gs[i] == sc[j]){
                        b++;
                        sc[j]='B';
                        break;
                    }
                }
            }
        }
        return a+"A"+b+"B";
    }
}

这种做法,分为两步,

1.首先要把“公牛”找出,就是说把数字和位置都猜对的位置找出来,并且要在 secret数组打标记,说明这个位置已经用过了,不能让guess数组中重复的数字 重复使用secret中的数字

2.然后就要找“奶牛”,找奶牛的一个条件是 如果sc[i]='A',这个guess位置上的判定过了,就跳过 

2.题解

class Solution {
    public String getHint(String secret, String guess) {
        int a=0,b=0;
        int[] s = new int[10];
        int[] g = new int[10];
        for(int i=0;i<secret.length();i++){
            s[secret.charAt(i)-'0']++;
            g[guess.charAt(i)-'0']++;
            if(secret.charAt(i) == guess.charAt(i)) a++;
        }
        for(int i=0;i<s.length;i++){
            b+=Math.min(s[i],g[i]);
        }
        return a+"A"+(b-a)+"B";
    }
}

这个做法的角度是统计secret和guess中各种数字出现的次数,放在s[],g[]中,每个i位置放的就是数字i出现的频率

第一个循环很好理解

第二个循环指的是    遍历s数组,取s[i]和g[i]中的较小数

取较小数的意思是指,比如在secret中1出现了5 次,在guess中出现了3次  肯定取最小数

这个最后得到的b其实是公牛和奶牛的组合,所以要用b-a

                                                                                                                                                             今天差点忘了2020.9.27 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值