day12

第一题

        

        本题我们可以使用以下方法:

方法一:

        使用hash表<元素,出现次数>来统计字符串中不同元素分别出现的次数,当某一个元素的次数大于1时,返回false,如果每个元素的出现次数都为1,则返回true;

方法二:

        对于hash表我们首先可以优化为int【】数组,最后我们可以继续优化为位图;

        我们采用位图的思想和以下列操作来解决上述问题:

        首先定义个位图变量,同时在32个位上,从右往左一次定义位置为0到31,并从右到左一次存放a,b。。。。。。等字符,最后进行位操作;

        当我们在元素的相应定义位置进行与1操作,如果结果得到1,则已经存放过该元素了,直接返回false;反之得到的结果为0,则代表右新的元素出现时,位图的相应定义位置进行或1操作,并继续进行循环操作;直到循环结束;

        综上所述,代码如下:

class Solution {
    public boolean isUnique(String str) {
        if(str.length() > 26){
            return false;
        }
        int bitMap = 0;
        for(int i = 0;i<str.length();i++){
            int x = str.charAt(i) - 'a';
            if(((bitMap >> x )& 1) == 1){
                return false;
            }else{
                bitMap = bitMap | (1 << x);
            }
        }
        return true;
    }
}

第二题

         

        本题采用位运算的方法来解决:

        解题思路,让我们新定义的数组中的每一个数字和原始数组中的每一个数进行异或,最终的得到的数就是原始数组中缺少的那个数字:

        举例如下:

        代码如下所示:

        

class Solution {
    public int missingNumber(int[] nums) {
        int ret = 0;
        for(int x : nums) {
            ret ^= x; 
        }
        for(int i = 0;i<=nums.length;i++){
            ret ^= i;
        }
        return ret;
    }
}

第三题

         

        解题过程如下图所示:

步骤一:

        由于异或可以理解为无进位相加,可算出没有进位的两数相加;

步骤二:

        由上图所示,两个数进行与操作,就可以得到需要进位的数字,只不过这个与的值需要左移一位;

        举个例子,详细过程如下所示:

        

        需要重复进行两个数的异或操作和取得进位数操作,直到需要加的进位数为0,此时就停止循环,代码如下所示:

class Solution {
    public int getSum(int a, int b) {
        while(b != 0){
            int x = a ^ b;
            int y = (a & b) << 1;
            a = x;
            b = y; 
        }
        return a;
    }
}

第四题

        将原数组中的每一个元素进行位图存放,然后计算多个元素的同一个位置上的数字之和,将这些和余3,如下图所示:

        最终每一个位置上存放被余到的数字,最终这些个数组成我们要求的出现一个的数;

        代码如下所示:

class Solution {
    public int singleNumber(int[] nums) {
        int ret = 0;
        for(int i = 0;i<32;i++){
            int sum = 0;
            for(int x : nums){
                if(((x >> i) & 1) == 1){
                    sum++;
                }
                sum %= 3;
            }
            if(sum ==1){
                ret = ret | (1 << i);
            }

        }
        return ret;
    }
}

ps:本次的内容就到这里了,如果大家感兴趣的话就请一键三连哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值