题目:随机输入n个数,去重,并按从小到大的顺序输出。
输入:n 以及 n个数字m,n:[1,1000] ,m:[1,500]
输出:去重且排序后的数字串
限制:时间复杂度 O(n)
解题语言:C语言
解题思路:
解决题目的核心是如何快速找到输入的数字是否重复,1)在已知输入的值得范围的情况下,所有可能输入的数可以映射为数组索引,当某一数值 m 输入过之后,将数组m索引下的值置1,之后再输入相同的数时,即可做过滤处理,从而达到去重的效果。2)遍历数组,打印出数组中值为1的索引,即可完成排序。
解题后的心得:
利用哈希算法可以O(n)的时间内完成去重
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define VALID_FLAG (1)
#define INVALID_FLAG (0)
#define HASH_LIST_LEN (501)
int main(int argc, char *argv[])
{
int i = 0;
int inputCount = 0;
int inputNum = 0;
int hash[HASH_LIST_LEN] = {0};
while (scanf("%d", &inputCount) != EOF)
{
for (i = 0; i < inputCount; i++)
{
scanf("%d", &inputNum);
hash[inputNum] = VALID_FLAG;
}
for (i = 0; i < HASH_LIST_LEN; i++)
{
if (VALID_FLAG == hash[i])
{
printf("%d ", i);
}
}
printf("\n");
memset(hash, 0, sizeof(hash));
}
return 0;
}