题目
题解
排序
class Solution {
public int singleNumber(int[] nums) {
int n=nums.length-1;
Arrays.sort(nums);
for(int i=0;i<n;i+=2){
if(nums[i]!=nums[i+1])
return nums[i];
}
return nums[n];
}
}
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)(排序)
空间复杂度: O ( l o g n ) O(logn) O(logn)(排序)
位运算
位运算真的好神奇…
异或运算:
- 0^a=a
- a^a=0,所以所有出现两次的数字进行异或操作,结果一定为0
- a^b^a=(a^a)^b=0^b=b,即满足结合律,这也是这道题用异或的原理
所以所有数字进行异或操作,得到的结果就是只出现一次的数字!其他数字两两相抵都变成0了
class Solution {
public int singleNumber(int[] nums) {
int single=0;
for(int num:nums){
single^=num;//异或操作
}
return single;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)