【4】利用数组特性进行排重和排序

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limou3434

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值