跟我一起学C(练习2)

题目来源: 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]已经越界,读取到的值是该内存存着的值。
发布了15 篇原创文章 · 获赞 0 · 访问量 957

猜你喜欢

转载自blog.csdn.net/zimovv/article/details/103941817