华为OD机试真题 Java 实现【数组去重和排序】【2023 B卷 100分】

news/2024/7/20 16:52:51 标签: 华为od, java, python, 倒序遍历, 字符串, 序列

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

二、输入描述

一个数组。

三、输出描述

去重排序后的数组。

四、解题思路

整体的解题思路:

  1. 输入一个数组,通过java8 Stream表达式(简洁/方便/上档次)快速拆解输入行;
  2. 定义一个map,存储每个数字出现的次数,key是数字,value是数字出现的次数;
  3. 根据题意要用到数组中数字出现的顺序,故使用 LinkedHashMap 来实现插入顺序和遍历顺序一致的 HashMap;
  4. 单独定义一个函数,根据map的值value进行降序排序;
    • 利用Map的entrySet方法,转化为list进行排序;
    • 利用Collections的sort方法对list排序;
    • 遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储;
    • 返回linkedHashMap;
  5. 遍历排序好的linkedHashMap,输出去重排序后的数组;

五、Java算法源码

java">package com.guor.od;

import java.util.*;

public class OdTest01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 给定一个乱序的数组
        int[] input = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();

        /**
         * 使用 LinkedHashMap 来实现插入顺序和遍历顺序一致的 HashMap
         *
         * key:数字
         * value:数字出现的次数
         */
        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < input.length; i++) {
            if (map.containsKey(input[i])) {
                map.put(input[i], map.get(input[i]) + 1);
            } else {
                map.put(input[i], 1);
            }
        }

        StringBuilder builder = new StringBuilder();
        // 根据map的值value进行降序排序
        Map<Integer, Integer> sortMap = getSortMap(map);
        for(Map.Entry<Integer,Integer> entry : sortMap.entrySet()){
            builder.append(entry.getKey()+",");
        }
        System.out.println(builder.substring(0,builder.length()-1));
    }

    /**
     * 根据map的值value进行降序排序
     */
    public static Map<Integer, Integer> getSortMap(Map<Integer, Integer> map) {
        // 利用Map的entrySet方法,转化为list进行排序
        List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(map.entrySet());
        // 利用Collections的sort方法对list排序
        Collections.sort(entryList, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                // 正序排列,倒序反过来
                return o2.getValue() - o1.getValue();
            }
        });

        // 遍历排序好的list,一定要放进LinkedHashMap,因为只有LinkedHashMap是根据插入顺序进行存储
        LinkedHashMap<Integer, Integer> linkedHashMap = new LinkedHashMap<Integer, Integer>();
        for (Map.Entry<Integer, Integer> e : entryList) {
            linkedHashMap.put(e.getKey(), e.getValue());
        }
        return linkedHashMap;
    }
}

六、效果展示

1、输入

1,1,2,4,4,4,2,2,3,3

2、输出

2,4,1,3

3、说明

根据题意:

按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。

  • 1出现2次
  • 2出现3次
  • 4出现3次
  • 3出现2次
  • 2和4都出现3次,2先出现,故是2,4
  • 1和3度出现2次,1先出现,故是1,3
  • 最后输出2,4,1,3

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/4934589.html

相关文章

【人工智能前沿弄潮】—— SAM系列:玩转SAM(Segment Anything)

玩转SAM(Segment Anything) 官网链接&#xff1a; Segment Anything | Meta AI (segment-anything.com) github链接&#xff1a; facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links fo…

Java旋转数组中的最小数字(图文详解版)

目录 1.题目描述 2.题解 分析 具体实现 方法一&#xff08;遍历&#xff09;&#xff1a; 方法二&#xff08;排序&#xff09;&#xff1a; 方法三&#xff08;二分查找&#xff09;&#xff1a; 1.题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&a…

【Java】线程数据共享和安全 -ThreadLocal

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理线程数据共享和安全 -ThreadLocal&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf…

Linux 终端操作命令(2)内部命令

Linux 终端操作命令 也称Shell命令&#xff0c;是用户与操作系统内核进行交互的命令解释器&#xff0c;它接收用户输入的命令并将其传递给操作系统进行执行&#xff0c;可分为内部命令和外部命令。内部命令是Shell程序的一部分&#xff0c;而外部命令是独立于Shell的可执行程序…

《深度学习与图像分析——基础与应用》书籍阅读

李松斌&#xff0c;刘鹏著&#xff0c;科学出版社 2023年5月20日16:32:38开始阅读&#xff0c;2023年7月12日读完。 1.基础知识 获得泛化能力是深度学习的最终目标。泛化能力是指处理未被观察个的数据的能力&#xff08;即不包含在训练数据中的数据&#xff09;。 训练集&…

matlab解微分方程:方向场

在微分方程中&#xff0c;常见的形式是&#xff1a; x ′ f ( x , t ) xf(x,t) x′f(x,t) 方向场的每一个矢量可以形象地刻画一阶微分方程的解。在方向场中的每个点处&#xff0c;都会出现一条其斜率等于通过该点的微分方程解的矢量。给定一个初值&#xff0c;微分方程对应一条…

【0day】复现广联达-Linkworks 协同办公管理平台GetUserByUserCode接口存在SQL注入漏洞

目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 广联达科技股份有限公司成立于1998年,以建设工程领域专业应用为核心基础支撑,以产业大数据、产业新金融等为增值服务的数字建筑平台服务商。广联达-Linkworks 协同办公管理平台GetUserByUserC…

什么是BitTorrent协议?

BitTorrent 是一个 P2P (Peer-to-Peer) 通信协议&#xff0c;它设计用于分发数据和电子文件在互联网上。BitTorrent 是目前世界上最流行的 P2P 文件共享协议之一&#xff0c;以下是对 BitTorrent 协议的详细解释&#xff1a; 种子和对等体&#xff1a; 种子&#xff08;Torrent…