您的位置:首页 > 其它

leetcode136. 只出现一次的数字

2019-04-02 20:30 183 查看

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

1.自己想到的解法是先通过Arrays.sort对数组排序,至少nlogn时间复杂度,
再遍历有序数组,当nums[i]==nums[i+1]时,i+=2这样。增加了多余的时间复杂度

2.最好的方法是通过^(异或运算符),因为题目只要数相同都是2个,那么这题目偶数个一定是返回0,为奇数时题意才有解。
通过设置single=0;不断执行single = single^nums[i].最后留下来的就是单独的那个数。

原理就是利用二进制在^(异或条件下)
当single=0; 二进制为00000000
nums[i] = 4,二进制为00000100,异或的结果为4,
拿4去异或下一个值nums[i+1] = 2
nums[i+1]=2,二进制为00000010结果为6,为什么呢?在异或条件下,相同为0,不同为1.
eg: 4 – 二进制–00000100
2 – 二进制–00000010
异或----------------------------------------
等于6 --二进制—00000110
所以当为奇数个时,第一次^新值是相当于做加法,当第二次 ^相同的值时,这次是做减法(你们可以自己写二进制)

附上最好的解法:

class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for(int i = 0;i < nums.length; i++){
single = single ^ nums[i];
}
return single;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: