给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路
要求: 线性时间复杂度 O(n) 和 空间复杂度 O(1)
- 暴力法
复杂度 是 时间复杂度O(n^2) 空间复杂度O(n) - hash值
复杂度 是 时间复杂度O(n) 空间复杂度O(n) - 位运算
以上两种都不满足要求 , 又因为 题目只有一个是单独的出现其余的都是2个,因此使用异或的方法,因为异或是 0 a⊕a=0 a⊕0=a a⊕b⊕a=(a⊕a)⊕b=0⊕b=b
class Solution {
public int singleNumber(int[] nums) {
int res = nums[0];
for(int i = 1; i < nums.length;i ++){
res = res ^ nums[i];
}
return res;
}
}
补充
java 中的 位运算
- ^ (异或运算) ,相同的为0,不同的为 1
- &(与运算) ,只要有一个为0,就为0
- <<(向左位移)针对二进制,转化成二进制后向左移动3位,后面用0补齐
- >>(向右位移)针对二进制,转化成二进制后向右移动位 ,负数符号位跟着移动 最高位补1
- >>>(无符号右移),忽略符号位,空位都以0补齐
举例说明 4 5
System.out.println(-1>>4);
System.out.println(-1>>>4);
结果
-1
268435455