题目来源: https://www.nowcoder.com/question/next?pid=1088888&qid=36829&tid=30183191
[编程题]明明的随机数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
Input Param
n 输入随机数的个数
inputArray n个随机整数组成的数组
Return Value
OutputArray 输出处理后的随机整数
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。
输入描述:
输入多行,先输入随机整数的个数,再输入相应个数的整数
输出描述:
返回多行,处理后的结果
#include <stdio.h>
int isThereAnother(int i, int n, int* array)
{
for(int ivalue = array[i++]; i < n; i++)
{
if(ivalue == array[i])
{
return 1;
}
}
return 0;
}
void shift_element(int i, int* array)
{
int ivalue = array[i--];
for(; i >= 0 && array[i] > ivalue; i--)
{
array[i+1] = array[i];
}
array[i+1] = ivalue;
}
void insert_sort(int n, int* array)
{
for(int i = 1; i < n; i++)
{
if(array[i] < array[i-1])
{
shift_element(i, array);
}
}
}
int main()
{
int n;
while(scanf("%d", &n) != EOF) //支持多组数据的测试用例
{
int n_out = 0;
int inputArray[1000];
int outputArray[1000];
/* get inputArray */
for(int i = 0; i < n; i++)
{
scanf("%d", inputArray+i);
}
/* remove deplicated element */
for(int i = 0; i<n; i++)
{
if(!isThereAnother(i, n, inputArray))
{
outputArray[n_out++] = inputArray[i];
}
}
/* sort */
insert_sort(n_out, outputArray);
for(int i = 0; i < n_out; i++)
{
printf("%d\n", outputArray[i]);
}
}
return 0;
}
其它思路:
为1~1000这1000个数字设置标志,如果被抽到,则该数字对应的标志置1,否则默认为0。
while(scanf("%d", &n) != EOF)
{
int isSelected[1001] = {0};
int stuNum;
for(int i = 0; i < n; i++)
{
scanf("%d", &stuNum);
isSelected[stuNum] = 1;
}
for(int i = 1; i < 1001; i++)
{
if(isSelected[i])
{
printf("%d\n", i);
}
}
}
问:为什么int isSelected[1001]是1001?(如果是1000,那么isSelected[1000]的值会是1,这是为什么?)
答:
- 因为学号是从1开始的,所以第0个元素用不到。因此这里一共需要1001个元素。
- 定义int isSelected[1000] = {0};,表示数组元素个数是1000,但是index取值范围是0~999。由于数组是连续的内存空间,isSelected[1000]已经越界,读取到的值是该内存存着的值。