Leetcode-位运算之——136 137

位运算


代码参考解析
重点掌握
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移(左边消失,右边补0)
>> 右移(右边消失,左边补符号位)

位运算的操作数是整数类型或字符型.

#位运算的性质
1. 任何数和0做异或运算@,结果仍然是原来的数,即a@0=a
2. 任何数和其自身做异或运算,结果是0,即a@a=0。
3. 异或运算满足交换律和结合律,即a@b@a=b@a@a=b@0=b.

4. ~x表示位运算NOT x&y 表示位运算AND x@y表示位运算XOR

public int singleNumber(int[] nums){
	int single=0;
	for(int i:nums){
		single^=num;
	}
	return single;
}

除一个数字以外,其余数字都出现m次的通用问题

public int sigleNumber(int[] nums){
	int counts=new int[32];
	for(intnum:nums){
		for(int j=0;j<32;j++){
			counts[j]+=num&1;
			num>>>=1;
		
		}
	}
	int res=0;m=3;
	for(int i=0;i<32;i++){
		res<<=1; //左移1位
		res|=count[31-i]%m;//恢复第i位值到res
	}
	return res;

}


给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素

class Solution {
    public int[] singleNumber(int[] nums) {
        int temp = 0;
        //求出异或值
        for (int x : nums) {
            temp ^= x;
        }
        //保留最右边的一个 1
        int group = temp & (-temp);
        System.out.println(group);
        int[] arr = new int[2];
        for (int y : nums) { 
            //分组位为0的组,组内异或
            if ((group & y) == 0) {
                arr[0] ^= y;
            //分组位为 1 的组,组内异或   
            } else {
                arr[1] ^= y;
            }
        }
        return arr;
    }
}

时间复杂度为o(n),空间复杂度为o(1);
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

普通解法:
1 集合 sumx2|3再减去nums
2 hashmap遍历
3 排序法

HashMap<String, Integer> map=new HashMap<>();
	Set<String> map1 = map.keySet();
	//常用
	Map.Entry<String, Integer> map2 = (Entry<String, Integer>) map.entrySet();
	//map2.getKey()|map2.getValue()
	Iterator<Integer> map3 = map.values().iterator();
	//put传进去getOrDefault为0;
	hashmap.put(num, hashmap.getOrDefault(num, 0) + 1);
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值