經典筆試題練習之陣列查詢(1)第一個重複元素
阿新 • • 發佈:2018-12-12
《劍指OFFER名題精講2版》P39 題目侷限性: 輸入陣列的長度0-200,陣列內每個元素都在0-200之間。 解決思路: 使陣列的值與陣列下標一一對應。 書中原始碼:
#include<stdio.h> #include<stdlib.h> #define false 0 #define true 1 int dup(int num[],int len,int *dup) { int i,tmp; if(num==NULL||len<0) { return false; } for(i=0;i<len;i++) { if(num[i]<0||num[i]>len-1) { return false; } } for(i=0;i<len;i++) { while(num[i]!=i) { if(num[i]==num[num[i]]) { *dup=num[i]; return true; } tmp=num[i]; num[i]=num[tmp]; num[tmp]=tmp; } } return false; } int main(int argc, const char *argv[]) { int a[7]={2,3,1,0,2,5,3}; int ret; for(ret=0;ret<7;ret++) { printf("%d\n",a[ret]); } dup(a,7,&ret); printf("%d\n",ret); return 0; }
自己動手寫一下(未完待續):
#include<stdio.h> #include<stdlib.h> #include<string.h> #define false 0 #define true 1 #define LEN(x) (sizeof(x)/sizeof(int)) int dup(int num[],int len,int *dup) { int i,tmp; if(num==NULL||len<0) { return false; } for(i=0;i<len;i++) { if(num[i]<0||num[i]>len-1) { return false; } } for(i=0;i<len;i++) { while(num[i]!=i) { if(num[i]==num[num[i]]) { *dup=num[i]; return true; } tmp=num[i]; num[i]=num[tmp]; num[tmp]=tmp; } } return false; } int f(int a[],char buf[],int len) { int i,n,sum; i=0; sum=0; //發現此時LEN(a)=1 //printf("in f=%d\n",LEN(a)); /* for(i=0;i<7;i++) { printf("buf[%d]=%d",i,buf[i]); } */ for(i=0;i<len;i++)//迴圈語句易出錯,注意 { a[i]=buf[i]-48; } printf("\n"); for(i=0;i<len;i++) { printf("%d\n",a[i]); } return sum; } int main(int argc, const char *argv[]) { //int a[7]={2,3,1,0,2,5,3}; //int a[7]; //int a[20];//發現浪費了空間,需求動態分配空間。 int *a; int ret=0; char buf[20]; char *s; /*輸入一 一個一個輸入陣列元素 for(ret=0;ret<7;ret++) { scanf("%d",&a[ret]); } 相同寫法 scanf("%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]); */ /*輸入二 //輸入字串12345放陣列a裡 scanf("%s",buf); //printf("%d\n",atol(a));//用庫函式轉換成一個int //printf("%s\n",buf+1);//移動了1位元組(1個char型數的大小) f(a,buf,LEN(a));//呼叫函式,分割字元填入陣列 */ //輸入三,不定長數字,#結束,建立對應長度的陣列 //輸入四,不定長字串,#結束,建立對應長度的陣列 for(ret=0;ret<7;ret++) { printf("%d\n",a[ret]); } //輸出一,查出第一個重複出現的數字 //dup(a,LEN(a),&ret); //printf("%d\n",ret); //輸出二,查出數組裡所有重複的值 return 0; }