位运算的操作数是整数类型或字符型.
#位运算的性质
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);
}