class Solution {
public int[] singleNumbers(int[] nums) {
int x = 0, y = 0, n = 0, m = 1;
for(int num : nums){
n ^= num;
}
while((n & m) == 0){
m <<= 1;
}
for(int num : nums){
if((num & m) != 0) x ^= num;
else y ^= num;
}
return new int[]{x, y};
}
}
解题思路:
对
我就只会用map
这题又没有限制, 就别用位运算卷了好伐, 我真的会谢
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
for(Integer a : map.keySet()){
if(map.get(a) == 1) return a;
}
return -1;
}
}
解题思路:
虽然但是
位运算解法还是要记录一下大佬的
之后能看懂就看懂, 看不懂算了TvT
下述代码中将m = 3
换成别的数字, 此题就等价于
除了一个数字以外,其余数字都出现 m 次
对二进制每位上的数
%3
, 最后结果是1
的就是只出现一次的那个数
class Solution {
public int singleNumber(int[] nums) {
int[] counts = new int[32];
for(int num : nums) {
for(int j = 0; j < 32; j++) {
//记录二进制数字最右位的数
counts[j] += num & 1;
//无符号右移, 获取num所有位的值
num >>>= 1;
}
}
int res = 0, m = 3;
for(int i = 0; i < 32; i++) {
res <<= 1;
res |= counts[31 - i] % m;
}
return res;
}
}