给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
/**
* @author zhang
* 思路:
* 因为只有一个数字出现了一次,所以我就写了几个判断
* 先进行排序,有三种情况
* 1.数组长度为1,直接返回
* 2.nums[0]只出现一次 nums[num.length-1]只出现一次,这样就返回nums[0]或num[num.length-1]
* 3.在中间,这样就通过判断和两边的是否相等,若不相等那么就是只出现一次
*/
public class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
if (nums.length == 1) {
return nums[0];
}
if (nums[0] != nums[1]) {
return nums[0];
}
if (nums[nums.length - 1] != nums[nums.length - 2]) {
return nums[nums.length - 1];
}
for (int i = 0; i < nums.length - 2; i++) {
if (nums[i] != nums[i + 1] && nums[i + 1] != nums[i + 2]) {
return nums[i + 1];
}
}
return 0;
}
但是这样执行用时比较长
参考了一下大佬的答案,了解了异或运算,确实很棒,不过我上面的思路和异或的思想大概是一样的,但是在此之前不了解异或运算
使用异或运算,将所有值进行异或
异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了
优化后的代码,太强啦
/**
* @author zhang
* 思路:
* 使用异或运算,将所有值进行异或
* 异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
* 因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了
*/
public class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result = result ^ num;
}
return result;
}
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/
版权属于:张子
本文链接:https://www.znzzi.com/articles/175
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。