剑指offer:数组中重复的数字

来源:互联网 发布:pdf.js 打开 word文档 编辑:程序博客网 时间:2024/06/04 18:27
  • 题目描述
    在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

  • 分析
    因为找出任意一个重复的数字,所以排序,然后找出第一个跟后面的元素相等的元素输出就是返回结果。
    当然,也有比较高端一点的,因为数组中所有的数字都在0-1的范围内,所以如果没有重复的数字的话,数组中的元素应该刚刚好为0~n-1,否则的话,我们对数组进行重排,对于元素numbers[i],如果numbers[i]==i,扫描下一个;否则,numbers[i]和numbers[numbers[i]]比较,如果相等,就找到了一个重复的数字,如果不等,交换numbers[i]和numbers[numbers[i]]的值,继续比较。(但是,我觉得这个比较麻烦没有必要这么做,而且容易超时)主要代码见代码2

  • 代码

 bool duplicate(int numbers[], int length, int* duplication) {        if(length==0)            return false;        else{            sort(numbers,numbers+length);            for(int i=0;i<length-1;i++){                if(numbers[i]==numbers[i+1]){                    *duplication=numbers[i];                    return true;                }             }            return false;        }    }};
  • 代码2
bool duplicate(int numbers[], int length, int* duplication) {        for(int i=0;i<length;i++){            while(number[i] == i){                if(numbers[i] == numbers[numbers[i]]){                    *duplication = numbers[i];                    return true;                }                int temo=numbers[i];                numbers[i] = numbers[numbers[i]];                numbers[numbers[i]]=temp;            }        }        return false;    }