乱序数组 删除所有重复元素 使得每个元素只出现一次 并且按照出现次数由高到低排序 相同出现次数 按照第一次出现的顺序进行先后排序(要求稳定)

本文主要是介绍乱序数组 删除所有重复元素 使得每个元素只出现一次 并且按照出现次数由高到低排序 相同出现次数 按照第一次出现的顺序进行先后排序(要求稳定),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 思路:

  • 首要统计数组中每个元素出现的频次以及出现顺序(以第一次出现的为准)
  • 创建一个结构体,包含: val count order
  • 构造一个比较器确定比较规则(按照出现次数多少从大到小排序,出现次数相同则按照出现顺序order排序)
    public static int[] fx(int[] arr) {//收集节点信息HashMap<Integer, Node> map = new HashMap<>();int count = 0;for (int val : arr) {if (!map.containsKey(val)) {Node node = new Node(val, 1, count);map.put(val, node);count++;} else {Node node = map.get(val);node.count = node.count + 1;map.put(val, node);}}Collection<Node> values = map.values();Node[] nodes = values.toArray(new Node[0]);//生成信息后的原始节点信息for (Node n : nodes) {System.out.println(n.val + "\t" + n.count + "\t" + n.order);}System.out.println();Arrays.sort(nodes, new NodeComparator());//排序后的节点for (Node node : nodes) {System.out.println(node.val + "\t" + node.count + "\t" + node.order);}System.out.println();int[] res = new int[count];for (int i = 0; i < res.length; i++) {res[i] = nodes[i].val;}System.out.println(Arrays.toString(res));return res;}private static class Node {public int val; //值public int count; //值重复次数public int order; //顺序public Node(int val, int count, int order) {this.val = val;this.count = count;this.order = order;}}private static class NodeComparator implements Comparator<Node> {@Overridepublic int compare(Node o1, Node o2) {//构建比较器,统计次不同时按次数比较否则按出现顺序排序return o1.count != o2.count ? o2.count - o1.count : o1.order - o2.order;}}

这篇关于乱序数组 删除所有重复元素 使得每个元素只出现一次 并且按照出现次数由高到低排序 相同出现次数 按照第一次出现的顺序进行先后排序(要求稳定)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/593690

相关文章

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用