题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路:
解法一:运行时间8ms(没优化)
先对数组排序,使用内置的排序算法,然后再遍历数组循环i,判断i与i+1位是否相等,然后i+=2。。
由于内置排序是快速排序,所以时间复杂度是O(nlogn)
代码:
public static int singleNumber(int[] nums) {
Arrays.sort(nums);
int i = 0;
while(i<nums.length-1){
if(nums[i] != nums[i+1]){
return nums[i];
}
i += 2;
}
return nums[nums.length-1];
}
解法二:优化后---运行时间1ms
使用 异或 " ^ "。异或:二进制中相同返回0,不同返回1。
因为数组中 数字是成对出现的,并且只有一个为一的数字。所以让他们两两异或,最后留下的一定的 那个唯一的数字。因为异或满足交换律,相同的都会两两抵消。
代码:
public static int singleNumber(int[] nums) {
int res = 0;
for(int i=0;i<nums.length;i++)
res ^= nums[i];
return res;
}