1、启发来源
牛客网题目:小乐乐与序列(去重与排序)
- 描述
老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他。 - 输入描述:
第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n) - 输出描述:
输出一行,为去重排序后的序列,每个数后面有一个空格。
2、具体代码
int main()
{
int n, i, input, max = 0;
int a[100001] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &input);
a[input] = input;//把相同的数存进相同的数组元素中
if (input >= max)
{// 这样该数组元素只会保留一个相同的数
max = input;
}
}
for (i = 1; i <= max; i++)
{
if (a[i])
{ //按序输出非零元素
printf("%d ", a[i]);
}
}
return 0;
}
3、启发意义
①优点:该代码十分巧妙利用了数组的下标和初始化,去除了重复和排序的问题
②缺点:当输入数据较大时,数组会必须要很大,故要注意数据大小问题、以及浪费数组空间大小的问题
4、从同学那里得来的类似OJ练习题
这个题目和上面的牛客网的题目使用的思路是相同的,先给出一个简单的解决代码
#include <stdio.h>
int main()
{
char char_arr[26] = { 0 };//存储从a到z的单个字符
char ch;
int max = 0;
int number = 0;
while ((ch = getchar()) != '\n')//从输入缓冲区获取单个字符进行处理
{
char_arr[ch - 'a']++;
//如果是ch=='a',那么'a'-'a'==0,则在char_arr[0]上的0+1,代表找到一个a
//如果下一个字符ch=='c',那么'c'-'a'==2,则在char_arr[2]上的0+1,代表找到一个c
//如果下一个字符ch=='a',那么'a'-'a'==0,则在char_arr[0]上的1+1,代表又找到一个a,这个时候char_arr[0]存储了一个2,代表目前找到两个a
//以此类推,char_arr[0]存储的是a出现的个数,char_arr[1]存储的是b出现的个数……
}
for (int i = 0; i < 26; i++)
{
if (char_arr[i] > max)//找出数组中存放最大的元素,并且把这个数组元素下标找到
{
number = i;
max = char_arr[i];
}
}
printf("%d %c\n", char_arr[number], number + 'a');
return 0;
}