剑指Offer——数组中重复的数字

思路:空间复杂度为O(1),时间复杂度为O(n)。将数字为N的数字放在第N个位置上。

1、扫描下标为i的数字时,判断这个数字m(nums[i])是否和下标i相等。

如果是,则接着扫描下一个数字;

如果不是,则将这个数字m与下标为m的数字交换位置

2、在交换位置之前,先进行比较,

       如果m=nums[m],那么重复的数字就出现了;

       如果不相等,则直接交换位置;直到发现重复的数字为止。

public  boolean duplicate(int numbers[],int length,int [] duplication) {
        //判断边界值,是否为空数组
        if(numbers==null||length<=0)
            return false;
        for(int i=0;i<length;i++){
            if(numbers[i]!=i){
                int temp=numbers[i];
                if(numbers[temp]==temp){
                    //输出这个数组
                    duplication[0]=temp;
                    //System.out.println(duplication[0]);
                    return true;
                }else{
                    numbers[i]=numbers[temp];
                    numbers[temp]=temp;
                }
            }
        }
            return false;
    }

总结:1、在写代码的时候如果脱离编辑器,要注意的地方就是字母的拼写。我因为numbers写成了number和duplication也写错了,导致编译好多次都不通过。

          2、写代码之前一定要仔细想清楚思路,我复习时因为过于自信。把需要交换的数据的下标和数字是否相等写成了当下循环的数据的判断。正确的应该if(numbers[temp]==temp),但是我写成了if(numbers[i]==i).所以先写伪代码,理清思路再动手写代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值