符号知识:
- |=:两个二进制对应位都为0时,结果等于0,否则结果等于1;
- &=:两个二进制的对应位都为1时,结果为1,否则结果等于0;
- ^=:两个二进制的对应位相同,结果为0,否则结果为1。
System.out.println( 5|3 );
// 5 --> 101
// 3 --> 011
// | --> 111 --> 7
System.out.println( 5&3 );
// 5 --> 101
// 3 --> 011
// & --> 001 --> 1
System.out.println( 5^3 );
// 5 --> 101
// 3 --> 011
// ^ --> 110 --> 6
题目
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 : 输入:nums = [2,2,1] 输出:1
示例 2 : 输入:nums = [4,1,2,1,2] 输出:4
基本思路:
方案一:排序
- 先排序,再循环 排除相同项
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int i=0, j=1;
while ( j<nums.length-1) {
if ( nums[i]==nums[j]) {
i+=2;
j+=2;
}else {
break;
}
}
return nums[i];
}
方案二:异或运算
- 既然除了那个一其它数都是两两一对
- 那么从头开始进行异或运算
- 相同的2个数一定会被归零,只剩下最后一个单独的数
public static int singleNumber(int[] nums) {
for(int i=1;i<nums.length;i++) {
nums[0]^=nums[i];
}
return nums[0];
}