【剑指offer--C/C++】JZ3 数组中重复的数字

一、题目

这里是引用

二、本人思路及代码

这道题目它要求的时间空间利用率都是n,那么可以考虑创建一个长度为n的数组repeat初始化为0,下标代码出现的数字,下标对应的数组内容代表该下标数字出现的次数。然后遍历提供的数组,每出现一个数字,就去repeat数组下标对应位置内容+1,然后判断如果已经>1了,那说明重复了,直接返回这个下标数字即可。

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numbers int整型一维数组 
 * @param numbersLen int numbers数组长度
 * @return int整型
 */
int duplicate(int* numbers, int numbersLen ) {
    // write code here
    
    //int repeat[numbersLen]={0};
    int *repeat = (int*) malloc (numbersLen * sizeof(int));
    for(int j=0;j<numbersLen;j++) repeat[j]=0;
    for(int i=0;i<numbersLen;i++){
        int n=numbers[i];
        if(n>=numbersLen){
            return -1;
        }else {
            repeat[n]++;
            if(repeat[n]>1){
                return n;
            }
        }
    }
    return -1;
}

三、疑问

这里为什么不能直接创建一个长度为numbersLen的数组呢? 编译报错说是numbersLen是一个会变的数字,不能用它作为数组长度,可是,当运行到这个子函数内部并创建数组的时候,numbersLen不是一个已知的且在子函数退出之前固定不变的数吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值