面试题03. 数组中重复的数字 java

此题使用java set即可快速解决问题,在此省略那种算法。着重记录下使用数组排序(非常规排序)方式:

以 [2, 3, 1, 0, 5, 4, 3,5]为例:

 

i=0   num[i]=2    num[num[i]]= 1

交换:2 和1 (将2赶走放到他该在的位置)

13205435

 

i=0  num[i]=1 num[num[i]]= 3

交换:1 和3 (1也不该在这里,将1赶走放到他该在的位置)

31205435

 

i=0 num[i]=3 num[num[i]]= 0

交换:3 和0 (3也不该在这里,将3赶走放到他该在的位置)

01235435

 

此处省略了正确的步骤,1,2,3的位置都正确:

i=1  num[i]=1  num[num[i]]= 1

i=2  num[i]=2  num[num[i]]= 2

i=3  num[i]=3  num[num[i]]= 3

i=4  num[i]=5  num[num[i]]= 4

 

i=4 num[i]=5 num[num[i]]= 4

交换:5 和4

01234535

 

 5位置正确继续

i=5 num[i]=5 num[num[i]]= 5

i=6 num[i]=3 num[num[i]]= 3 此时发现i=6位置上的数是应该出现在以前的位置上,说明重复了!返回即可

 

class Solution {
    public int findRepeatNumber(int[] nums) {
        int temp;
        for(int i=0;i<nums.length;i++){
            while (nums[i]!=nums[nums[i]]){
                temp=nums[i];
                nums[i]=nums[temp];
                nums[temp]=temp;
            }
            if(nums[i]!=i){
                return nums[i];
            }
        }
        return -1;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值