C++ 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字

完整题目:一个长度为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;
}

代码不长,写出来也不难,就是想思路卡了我挺长时间的,数据结构学习还是有很长一段路要走。

发布了6 篇原创文章 · 获赞 2 · 访问量 362

猜你喜欢

转载自blog.csdn.net/weixin_44157488/article/details/104066772