寻找连续数中丢失的数

题目如下:

现在有一个数组,其值为从1到10000。由于某次偶然操作,导致这个数组中丢失了某三个元素,同时顺序被打乱,现在需要你用最快的方法找出丢失的这三个元素,并且将这三个元素根据从小到大重新拼接为一个数字,计算其除以7的余数。

例:丢失的元素为336, 10, 8453,得到的新数字为10368453,除以7的余数为2.

输入数据为一行,包含9997个数字,空格隔开。

输出为一行,包含一个数字。


题目要求用最快的方法去做,但是我没有深入的思考,用了比较简单的方法去做。思路大概是这样:

1.将输入的数据存放在数组arr中并从按小到大排序。

2.定义一个变量i从1增长到10000,一个记录数组arr下标的指针j,将数组中的元素和i的值比较,如果arr[j]  不等于 i 说明 i 就是丢失的数。(7考虑连续丢失的数)接着让 i自增,直到 i 与 arr[j] 相等,j++,i++。还有一个要注意的问题是,丢失的数超过9997,就要控制 j 的增长 否则会出现数组越界问题。

3.将找到的丢失的数排序,转换为字符串,再拼接起来转换为整数,在这里就偷懒了直接调sprintf函数,strcat函数和atoi函数


#include
#include
#include

#define TOTAL 9997
void FindTheNum(int *arr, int length, int *find);
void my_sort(int *arr, int length);


int main()
{
	int i , j;
	int num[TOTAL];
	int find[3];
	char str[100];
	char temp_str[100];
	
	for(i = 0 ; i < TOTAL; i++)
	{
		scanf("%d", &num[i]);
	}

	 my_sort(num, TOTAL); 
	 FindTheNum(num, TOTAL, find);
	 my_sort(find, 3);
	
	 memset(str, '\0', sizeof(str));
	 for(i = 0; i < 3; i++)
	 { 
	 	sprintf(temp_str, "%d", find[i]);
	 	strcat(str,temp_str);
	 }	 
	 printf("%d\n", atoi(str) %7);
	 
	return 0;
}

void my_sort(int *arr, int length)

{
	int i, j, temp;
	if(arr == NULL)	return;
	
	for(i = 0; i < length; i++)
	{
		for(j = i+1; j < length; j++)
		{
			if(arr[i] > arr[j])
			{
				 temp = arr[i];
				 arr[i] = arr[j];
				 arr[j] = temp;
			}
		}
	}
	
}

void FindTheNum(int *arr, int length, int *find)
{
	int i = 0;
	int j = 0;
	int k = 0;
	for(i = 1; i <= length + 3 ; i++)	
	{
		while(i != arr[j])
		{
			find[k++] = i++;
			if(k == 3) return;
		}
		if(j+1 < length) j++;		
	}	
}


你可能感兴趣的:(数据结构与算法)