[开心IT面试题] 1001个数字组成的数组中,找出重复的数字

题目:

假设你有一个用1001个整数组成的数组,这些整数是任意排列的,

但是你知道所有的整数都在1到1000(包括1000)之间。

此外,除一个数字出现两次外,其他所有数字只出现一次。

假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。

如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

 

思路:

使用了辅助的存储方式:

假设1001个数组组成的数组Array[1001];创建一个容量1000的数组Count[1000],数组清零。

遍历一遍Array,将Array[i]的值当作Count下标序号,置Count[Array[i]-1]=1;

即当Array[i]=20时,Count[19]=1;

每遍历一个Array的数值,先检查对应的Count值是否为1?

若为1则表示该数值就是重复出现的数字;若为0则表示该数值还没出现过,将其置1。

 

不使用了辅助的存储方式:

将1001个数组组成的数组求和得Sum1。将1到1000求和得Sum2。

Sum1与Sum2之差就是出现两次的数字。

 

代码: 

使用了辅助的存储方式:

int FindRepeatNumber(int Array[])
{
    int Count[1000] = {0};
    for(int i = 0; i < 1001; i++)
    {
        if(Count[Array[i]-1] == 1)
        {
            return Array[i];
        }else
        {
            Count[Array[i]-1] = 1;
        }
    }
}

 

不使用了辅助的存储方式:

int FindRepeatNumber(int Array[])
{
    int Sum1 = Array[0];
    int Sum2 = 0;
    for(int i = 1; i < 1001; i++)
    {
        Sum1 += Array[i];
        Sum2 += i;
    }
    return Sum1-Sum2;
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值