牛客网华为机试“ 明明的随机数”详解与巧解

牛客HJ3 详解 + 巧解

原题

链接:link
在这里插入图片描述
想必当你看完题目,应该不难理解其题意,无非就是输入一堆数字(可重复),然后让你以升序且不重复的方式输出。简化为一下步骤

  • 首先输入一堆数字
  • 其次将输入的数字里面中的重复数字只保留一个、
  • 然后再将删去重复数字之后得到的那一堆数字按升序排列
  • 最后输出

剖析

详解

输入
输入一堆数组,很自然的会想到用一个数组来接收输入的数字

删重

  1. 首先将数组的每个元素与后面的的元素比较,遇到相同的就让该元素变为0, 到后面你就会发现这么做的好处。还有一点要值得注意的是,这里是每个元素跟它后面的比较,而不是每次都从头比较。
  2. 经过上面的比较,重新赋值之后,你再回过头来看看原先的数组。你会惊奇的发现,该数组中原来那些重复的元素仅保留了一份,其余的都变成了0.
  3. 最后,我们可以再创建一个数组。对之前的那个数组进行一次遍历,把不为0的元素放到新创建的那个数组,那么新得到的这个数组就没有了之前重复的元素。

排序
排序的话,我们可以对之前新得到的数组采用冒泡排序,快速排序等方法对数组进行排序,那我这里就不做过多介绍~

输出
输出的话无非就是对排序完之后的新数组进行打印。

总的来说,这道题的难点就在于如何将一开始输入的那一组数字中的重复数字删除,然后再排序。
这种做法可能也是大多数人想到的,新开辟一个数组来接收原数组的不重复数字,这里的关键就是利用题目条件每个元素的大小,将后面的重复元素赋值为0,从而将数组中的重复元素给分离开来

巧解

这里既然说到了巧解,那肯定就不用那么麻烦,还要新创建一个数组来接收原来的不重复元素。废话不多说~直接上思路。

输入
输入的话,大多数人第一时间想到的还是把这些数字放到一个数组里面。但是你既然想到了数组,然后你再结合题目要你删除重复元素,你可曾记得被你忽略的一个简单的小细节,那就是数组的下标也是不可重复的
在这里插入图片描述
也就是说,你可以将要输入的那一组数字当作数组的下标来输入。那么该怎么操作呢?

  1. 首先,你可以先创建一个大小1001的数组(因为1 <= n <= 1000)
  2. 其次你可以给数组初始化为0
  3. 然后你可以输入数字了,把你输入的数字作为数组的下标,并使得你输入那个数字作为下标的元素赋值为1。

例如:
int i = 0;
int arr[500] = {0};
while (~scanf(“%d”, &i)){
arr[i] = 1;
}

删重
当你按照上述方式输入时,你会惊奇的发现,当你输入了重复的数字的时候,数组不会发生任何的改变。相当于默认删重。

排序
当你想要排序时,你又惊奇的发现,居然已经排好序了。

结果就是,在你输入数字的时候,输入,删重,排序直接一步就做完了
在这里插入图片描述
输出
输出的话,就是找到你输入进去,经过删重,排序的数字,这个时候你只需要去找原数组中哪些元素是1,然后将其下标输出即可。怎么样,是不是非常的nice。

代码

详解

#include<stdio.h>
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值