华为OD机试 c++【数组去重和排序】

该博客介绍了如何使用C++解决华为在线开发者(OD)机试中的一道题目,即给定乱序数组,去除重复元素并按出现次数降序排序。博主通过将输入转换为整数数组,利用Map统计每个元素频率,再进行排序来实现解题方案。

题目

给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

输入描述
一个数组

输出描述
去重排序后的数组

用例

输入	
1,3,3,3,2,4,4,4,5
输出	
3,4,1,2,5
备注	数组大小不超过100 数组元素值大小不超过100。

解题思路

将输入的乱序数组转换为整数数组,并使用 Map 统计每个元素的出现次数。然后对元素进行排序,按照出现次数从高到低排序,如果出现次数相同,则按照元素值的先后顺序排序。最后将排序后的结果输出。

代码

#include <iostream>
#
### 关于华为OD中的数组排序 在解决涉及数组排序的问题时,通常会综合运用多种数据结构技术来提高效率。对于数组而言,哈希表是一种非常高效的数据结构,它能够快速判断某个元素是否已经存在于集合中[^1]。 #### 使用哈希表实现数组 为了数组中的复项,可以通过遍历整个数组并将每个遇到的新元素存入哈希表的方式来进行操作。如果当前访问到的元素已经在哈希表里存在,则跳过该元素;反之则将其加入结果列表并记录至哈希表中作为已见过的项目之一。 ```java import java.util.*; public class ArrayDeduplicate { public List<Integer> deduplicate(int[] nums) { Set<Integer> seen = new HashSet<>(); List<Integer> result = new ArrayList<>(); for (int num : nums) { if (!seen.contains(num)) { result.add(num); seen.add(num); // 记录新发现的独特数值 } } return result; } } ``` #### 对数组进行排序 当涉及到对数组排序的需求时,可以选择内置的标准库函数或者自己编写高效的排序算法如快速排序等。标准库提供的`Arrays.sort()`方法适用于大多数场景下的需求,并且具有良好的性能表现。 ```java import java.util.Arrays; public class SortArrayExample { public void sortAndPrint(int[] array){ Arrays.sort(array); System.out.println(Arrays.toString(array)); } } ``` 上述代码展示了如何利用Java自带的功能完成简单的升序排列任务。当然,在实际面过程中可能会被要求手动实现特定类型的排序逻辑以考察候选人的基础知识掌握情况。 #### 结合案例说明 考虑到具体应用场景可能更加复杂,比如需要先做某些预处理工作再执行排序或是在排序之后还要进一步筛选符合条件的结果集等情况。下面给出一个稍微复杂的例子:给定一组整数,首先要除其中所有的负数,接着按照绝对值大小从小到大排序最后输出不含有任何复正整数的序列[^3]。 ```java import java.util.*; class SpecialSort { private static final Comparator<Integer> ABS_COMPARATOR = Integer::compareUnsigned; public static List<Integer> specialProcess(List<Integer> numbers) { Map<Integer, Boolean> map = new LinkedHashMap<>(); for(Integer number : numbers.stream().filter(x -> x >= 0).toList()){ map.putIfAbsent(number, true); } List<Integer> list = new ArrayList<>(map.keySet()); list.sort(ABS_COMPARATOR); return list; } public static void main(String[] args) { List<Integer> inputList = Arrays.asList(-7,-5,2,8,9,2,4,6,8,9); System.out.println(specialProcess(inputList)); } } ``` 此程序片段实现了从原始输入集中移除非正值成员、消除冗余条目以及依据绝对值得顺序整理最终输出这三个主要功能点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AlgorithmHero

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

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

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

打赏作者

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

抵扣说明:

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

余额充值