只出现一次的数字

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

说明:

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

以上是原题目,先分析题目要求。

题目给了两个要求:

  1. 线性时间复杂度,也就是o(n).
  2. 没有额外空间,也就是空间复杂度为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];
    }
}

之前代码最重要的错误原因是数组长度没有减一,而在测试中有可能出现数组超过原本长度的情况,因此,才会出现报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值