一、題目
二、本人思路及代碼
這道題目它要求的時間空間利用率都是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不是一個已知的且在子函數退出之前固定不變的數嗎?