题目如下:
现在有一个数组,其值为从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<stdio.h>
#include<string.h>
#include<stdlib.h>
#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++;
}
}