完整题目:一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
题目思路:
在牛客网上看到的题目,其实在这种限定条件下用求和法也可以做,思路更简单。现在我用的这种是思路复杂一点的做法,牛客网做法没注释所以没看懂,自己实践的时候补充了以下思路。
先从数组第一个数开始算,若元素下标值等于元素的值,则暂时没有重复,值与下标对应上了,可以看作给这个数排了序,访问的数组元素往后移一个
若若元素下标值不等于元素的值,则有可能重复,这里还有再加一重判断。
1.若元素下标值的值等于元素的值,则重复了,直接返回false
2.若元素下标值的值不等于元素的值,交换两个值(这样子虽然当前元素还是不知道有没有重复,但是你可以把后一个数,即把元素下标值的值与其下标对应起来,相当于间接把后面的数给排序,对应了),访问的数组元素往后移一个
基于题目规则,for遍历完还是没有跳出false,代表所有元素都刚好对应上下标了,不然在上面第2点小步骤里就应该跳出if判断,不交换两个值了,现在即没有重复,则直接返回ture。
我的代码如下:
#include <iostream>
bool judge(int *arr,int &length){
int i,temp;
for(i=0;i<length;++i){
while(arr[i]!=i){
if(arr[i]!=arr[arr[i]]){
temp=arr[arr[i]];
arr[arr[i]]=arr[i];
arr[i]=temp;
}
else return false;
}
}
return true;
}
int main(){
int arr[]={1,2,5,3,4,7,8,9,6};
int length=sizeof(arr)/sizeof(arr[0]);
if(judge(arr,length)){
std::cout<<"there is no repeat"<<std::endl;
}
else{
std::cout<<"there has repeat"<<std::endl;
}
return 0;
}
代码不长,写出来也不难,就是想思路卡了我挺长时间的,数据结构学习还是有很长一段路要走。