重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

不修改数组找出重复的数字(c语言)-创新互联

不修改数组找出重复的数字(c语言)让人瑟瑟发抖的面试题


创新互联专业IDC数据服务器托管提供商,专业提供成都服务器托管,服务器租用,成都服务器托管成都服务器托管,成都多线服务器托管等服务器托管服务。

不修改数组找出重复的数字(c语言)来我们看一下题目
在一个 长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。
注意:时间复杂度O(n),空间复杂度O(1)

不修改数组找出重复的数字(c语言)找出数组中重复的数字(c语言)怎么解决勒???
分析:利用题目中元素处于1~n的范围,把元素分为两组,判断两组元素个数,如果大于范围,则重复的数字就在这个范围内。例如:1~3范围中有4个数,说明其中至少有一个重复的数字。按此二分下去,将会剩下一个数字有两个,最后输出。
不修改数组找出重复的数字(c语言)来看看代码

#include
#define SIZE(arr) sizeof(arr)/sizeof(arr[0])//数组长度

int count_r(const int *arr,int start, int end,int len)//元素范围内元素的个数
{
    int count = 0;
    int i = 0;
    for (; i < len; i++)
    {
        if (arr[i] >= start&&arr[i] <= end)
        {
            count++;
        }
    }
    return count;
}
int duplicate1(const int *arr, int len)
{
    if (len < 0)
    {
        return 0;
    }
    int start = 1, end = len - 1;
    int count = 0;
   while (end >= start)
    {
        int mid = ((end - start) >> 1) + start;//元素中值
        count = count_r(arr,start, mid,len);//元素二分后,其中一组元素范围的个数
        if (count>(mid - start + 1))//确定元素范围
        {
            end = mid;
        }
        else
        {
            start = mid+1;
        }
        if (end == start)//确定元素定位到一个元素
        {
            if (count > 1)
                return start;
            else
                break;
        }
    }
    return 0;
}
int main()
{
    int arr[] = { 2, 3, 5,4,3,2,6,7 };
    printf("%d", duplicate1(arr, SIZE(arr)));
    return 0;
}

不修改数组找出重复的数字(c语言)总结:在不修改数组的情况下,只要知道数组元素范围,就可以通过二分元素的方法,找到重复的数字

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:不修改数组找出重复的数字(c语言)-创新互联
文章位置:http://cqcxhl.cn/article/gegde.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP