1. 程式人生 > >經典筆試題練習之陣列查詢(1)第一個重複元素

經典筆試題練習之陣列查詢(1)第一個重複元素

《劍指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;
}