给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
以上是原题目,先分析题目要求。
题目给了两个要求:
- 线性时间复杂度,也就是o(n).
- 没有额外空间,也就是空间复杂度为o(1).
我给出的方案就是,先进行排序然后,将排序后的结果进行对比,输出不同的那个数。
代码如下:
public int singleNumber(int[] nums) {
Arrays.sort(nums,0,nums.length);
for(int i=0;i<nums.length;i++){
if(nums[i]==nums[i+1]){
i+=2;
}else{
System.out.println(nums[i]);
return 1;
}
}
return 0;
}
测试代码的时候没有问题,但是在提交之后就出现了报错。报错内容如下:
Line 5: java.lang.ArrayIndexOutOfBoundsException: 1
经过修改,同样的方法,其正确代码如下:
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i+=2){
if(nums[i]!=nums[i+1]){
return nums[i];
}
}
return nums[nums.length-1];
}
}
之前代码最重要的错误原因是数组长度没有减一,而在测试中有可能出现数组超过原本长度的情况,因此,才会出现报错。