给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
我最初想用Set来解题,但发现这样做并不容易。因此,转换下思路。先对数组进行排序,此时相同的数会出现在一起。因此,数nums[i]如果与nums[i-1]和nums[i+1]都不相等的话(1<i<n-1),说明它就是那个数。首尾只需要比较相邻的一个数即可。
public int singleNumber(int[] nums) {
int length = nums.length;
Arrays.sort(nums);
// 特殊情况处理
if(length==1)
return nums[0];
// 特殊边界
if (nums[0] != nums[1])
return nums[0];
else if (nums[length - 2] != nums[length - 1])
return nums[length - 1];
for (int i = 1; i < length - 2; i++) {
if (nums[i] != nums[i - 1] && nums[i] != nums[i + 1])
return nums[i];
}
return 0;
}
这道题的思路和Q122:买卖股票的最佳时机有些相似。都是比较相邻两数,是一个从局部观全局的point。







网友评论