华为OD机试_2025 B卷_数组去重和排序(Python,100分)(附详细解题思路)

news2025/6/8 1:47:31

题目描述

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

输入描述
一个数组

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

用例

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

数组去重排序:按频次与顺序的艺术

核心解题思路

这道题的核心在于同时解决两个问题:去重特殊排序。我们需要:

  1. 删除重复元素:每个元素只保留一个
  2. 按出现频次排序:出现次数多的元素排前面
  3. 频次相同时按首次出现顺序排序:保持原始先后关系

关键技巧:

  • 使用字典记录元素的出现次数首次出现位置
  • 分阶段处理:先统计信息,再排序输出
  • 利用Python元组排序特性实现多条件排序

完整代码实现

def deduplicate_and_sort(input_str):
    # 统计元素信息和首次出现位置
    element_info = {}
    for index, num in enumerate(input_str):
        if num not in element_info:
            element_info[num] = [1, index]  # [出现次数, 首次位置]
        else:
            element_info[num][0] += 1  # 增加出现次数

    # 提取去重元素(保留首次出现的元素)
    unique_elements = []
    # 用于跟踪已添加的元素
    added_elements = set()

    for num in input_str:
        if num not in added_elements:
            unique_elements.append(num)
            added_elements.add(num)

    # 排序:频次降序 > 首次位置升序
    sorted_elements = sorted(
        unique_elements,
        key=lambda x: (
            -element_info[x][0],  # 频次降序
            element_info[x][1]  # 首次位置升序
        )
    )

    return sorted_elements


# 输入处理
input_str = input().split(',')

# 处理并输出
result = deduplicate_and_sort(input_str)
print(','.join(result))

关键特性分析

  1. 稳定去重:保留每个元素的首次出现
  2. 排序准确性
    • 高频元素优先排列
    • 相同频次元素按原始顺序排列
  3. 效率优化
    • 时间复杂度:O(n log n)(主要来自排序)
    • 空间复杂度:O(n)(存储元素信息和去重集合)
  4. 边界处理
    • 空输入处理:默认返回空列表
    • 单元素数组:直接返回该元素

算法原理解析

1. 信息统计阶段

使用字典 element_info 存储每个元素的出现次数首次出现位置

element_info = {}
for index, num in enumerate(input_str):
    if num not in element_info:
        element_info[num] = [1, index]  # 首次出现:计数=1,位置=当前索引
    else:
        element_info[num][0] += 1  # 非首次出现:计数增加

原理说明:

  • 字典键:元素值(如"1"、"3"等)
  • 字典值:包含两个元素的列表:
    • [0]:出现次数(频次)
    • [1]:首次出现位置(索引)
  • enumerate() 提供遍历索引,确保位置信息准确

2. 去重阶段

保留每个元素的首次出现:

unique_elements = []
added_elements = set()

for num in input_str:
    if num not in added_elements:
        unique_elements.append(num)
        added_elements.add(num)

原理说明:

  • 集合跟踪:使用 added_elements 集合记录已处理的元素
  • 首次出现处理:当元素不在集合中时添加到结果列表
  • 顺序保留:遍历顺序保证结果列表保留原始首次出现顺序

3. 排序阶段

多条件排序实现:

sorted_elements = sorted(
    unique_elements,
    key=lambda x: (
        -element_info[x][0],  # 频次降序
        element_info[x][1]     # 首次位置升序
    )
)

原理说明:

  • 双条件排序
    1. 主要条件:出现频次降序(高频优先)
    2. 次要条件:首次出现位置升序(位置小优先)
  • 负号技巧-频次 实现降序排序(避免使用reverse参数)
  • 元组排序特性:Python自动按元组顺序比较条件

示例解析(输入:1,3,3,3,2,4,4,4,5)

输入处理

input_str = "1,3,3,3,2,4,4,4,5"

处理后:

input_str = ["1", "3", "3", "3", "2", "4", "4", "4", "5"]

1. 信息统计阶段

元素处理过程结果统计
“1”首次出现["1"]: [1, 0]
“3”首次出现["3"]: [1, 1]
“3”再次出现["3"]: [2, 1]
“3”再次出现["3"]: [3, 1]
“2”首次出现["2"]: [1, 4]
“4”首次出现["4"]: [1, 5]
“4”再次出现["4"]: [2, 5]
“4”再次出现["4"]: [3, 5]
“5”首次出现["5"]: [1, 8]

最终统计结果:

element_info = {
    "1": [1, 0],
    "3": [3, 1],
    "2": [1, 4],
    "4": [3, 5],
    "5": [1, 8]
}

2. 去重阶段

遍历顺序: ["1","3","3","3","2","4","4","4","5"]
元素是否已添加操作unique_elements结果added_elements结果
“1”添加[“1”]{“1”}
“3”添加[“1”,“3”]{“1”,“3”}
“3”跳过[“1”,“3”]{“1”,“3”}
“3”跳过[“1”,“3”]{“1”,“3”}
“2”添加[“1”,“3”,“2”]{“1”,“3”,“2”}
“4”添加[“1”,“3”,“2”,“4”]{“1”,“3”,“2”,“4”}
“4”跳过[“1”,“3”,“2”,“4”]{“1”,“3”,“2”,“4”}
“4”跳过[“1”,“3”,“2”,“4”]{“1”,“3”,“2”,“4”}
“5”添加[“1”,“3”,“2”,“4”,“5”]{“1”,“3”,“2”,“4”,“5”}

最终去重结果:

unique_elements = ["1", "3", "2", "4", "5"]

3. 排序阶段

unique_elements = ["1", "3", "2", "4", "5"] 进行排序

元素频次位置排序键值元组
“1”10(-1, 0) → (-1,0)
“3”31(-3, 1) → (-3,1)
“2”14(-1, 4) → (-1,4)
“4”35(-3, 5) → (-3,5)
“5”18(-1, 8) → (-1,8)

排序规则:

  1. 比较元组第一个元素(负频次):

    • “3"和"4”:-3(频次3)优先于-1(频次1)
    • “1”、“2”、“5”:都是-1,需要进一步比较
  2. 比较元组第二个元素(位置):

    • “3”(位置1) vs “4”(位置5):1<5 → "3"排在"4"前
    • “1”(位置0) vs “2”(位置4) vs “5”(位置8):0<4<8 → “1”、“2”、"5"顺序不变

最终排序顺序:

  1. “3”(频次最高,位置最小)
  2. “4”(频次最高,位置较大)
  3. “1”(频次低,位置最小)
  4. “2”(频次低,位置中等)
  5. “5”(频次低,位置最大)

输出结果:

3,4,1,2,5

算法变通应用

这种方法可广泛应用于:

  1. 用户行为分析:找出高频操作序列
  2. 日志分析:统计高频错误及其首次发生时间
  3. 推荐系统:按物品流行度和新鲜度排序
  4. 数据清洗:去除重复记录并保留原始版本

通过这道题,我们掌握了处理多条件排序问题的核心技巧:分阶段收集信息明确排序优先级利用语言特性实现排序逻辑。这种思路可以延伸到各种复杂排序场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算 Linux Rocky day03(which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep)

云计算 Linux Rocky day03&#xff08;which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep&#xff09; 目录 云计算 Linux Rocky day03&#xff08;which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep&#xff09;1.which找到命令所对应的程序…

JVM 内存溢出 详解

内存溢出 内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值&#xff0c;从而使用内存时因空间不足而失败&#xff0c;虚拟机一般会抛出指定的错误。 在Java虚拟机中&#xff0c;只有程序计数器不会出现内存溢出的情况&#xff0c;因为每个线程的程序计数器只保…

虚拟机CentOS 7 网络连接显示“以太网(ens33,被拔出)“、有线已拔出、CentOS7不显示网络图标

文章目录 一、问题描述二、解决方法1、查看网络连接方式2、开启相关服务3、确认虚拟机网络连接 一、问题描述 问题描述&#xff1a;在VmWare中安装CentOS7, 启动后界面不显示网络的图标。 在GONE桌面—》设置中找到网络设置&#xff0c;发现显示线缆已拔出。 二、解决方法 …

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(六):图片上传交互功能

在 《Tailwind CSS 实战&#xff1a;基于 Kooboo 构建 AI 对话框页面&#xff08;五&#xff09;》 中&#xff0c;完成了语音交互功能的优化。本文作为该系列教程的第六篇&#xff0c;将聚焦于图片上传功能的开发。通过集成图片上传与预览能力&#xff0c;我们将进一步完善 AI…

传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。

传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。 传统的将自然语言转化为嵌入向量(Word Embedding)的核心机制是分布式语义假设(Distributional Semantics Hypothesis…

玄机-日志分析-IIS日志分析

1.phpstudy-2018站点日志.(.log文件)所在路径&#xff0c;提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…

【办公类-104-01】20250606通义万相50分一天用完,通义万相2.1专业版测试

背景需求&#xff1a; 昨天打开通义万相&#xff0c;发现分数降低到3位数&#xff0c;原来时1500.仔细看&#xff0c;原来每天的50分&#xff0c;只有1天有效期了。 用掉试试&#xff0c;用的是之前的30天积分&#xff0c;还是今天的1天积分 纯白色背景&#xff0c;卡通简笔画…

制作个人Github学术主页

1.fork一个模板 从模板网站Jekyll Themes fork一个模板&#xff0c;并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮&#xff0c;修改Branch为master /root 然后点击save &#xff0c;等待一会后刷新&#xff0c;便会生成一个新的site。 3.…

FineReport模板认证找不到模板

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1.现象及排查过程2. 解决办法 1.现象及排查过程 FR模板认证下面找不到模板 由于是集群部署的FR&#xff0c;所以后台查看了sftp服务器&#xff0c;测试连接&#xff0c;连接成功。 但是…

TomatoSCI数据分析实战:探索社交媒体成瘾

今天我们尝试对一份社交媒体成瘾的调查数据进行几项简单的分析&#xff0c;看看可以得出哪些有意思的结论&#xff1f;图1A是这份数据的说明&#xff0c;因为篇幅太长只把部分数据贴出来&#xff08;图1B&#xff09;。 01 不同性别的成瘾程度会不同吗&#xff1f; 我们使用bo…

网络安全厂商F5推出AI Gateway,化解大模型应用风险

AI正以前所未见的速度重塑数字化体验。然而&#xff0c;企业在加速落地现代化数字体验的过程中&#xff0c;其在保障和交付AI应用方面仍面临严峻挑战。这些应用需处理海量数据&#xff0c;涉及复杂流量模式&#xff0c;并引入更高级的安全威胁&#xff0c;而企业当前的安全能力…

pikachu靶场通关笔记16 CSRF关卡02-CSRF(POST)

目录 一、CSRF原理 二、源码分析 三、渗透实战 1、构造CSRF链接 &#xff08;1&#xff09;登录 &#xff08;2&#xff09;bp设置inception on &#xff08;3&#xff09;修改个人信息 &#xff08;4&#xff09;构造CSRF链接 2、模拟受害者登录 3、诱导受害者点击 …

中医的十问歌和脉象分类

中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指&#xff0c;实际包含12个核心问题&#xff0c;脉象28种中常见仅10余种&#xff0c;重点解释脉诊的物理本质&#xff08;血流动力学触觉感知&#xff09; 以下是中医十问歌的完整内容及脉…

构建 MCP 服务器:第 4 部分 — 创建工具

这是我们构建 MCP 服务器的四部分教程的最后一部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个 MCP 服务器。第二部分添加了资源模板并改进了代码组织。在第三部分中&#xff0c;我们添加了提示符并进一步完善了服务器结构。现在&#xff0c;我们将通过添加工具来…

如何以 9 种方式将照片从手机传输到笔记本电脑

使用 USB 电缆可以将照片从智能手机复制到计算机。但是&#xff0c;如果没有 USB 数据线&#xff0c;如何将照片从手机无线传输到笔记本电脑呢&#xff1f;为了解决这个问题&#xff0c;我们搜索并测试了不同的应用程序&#xff0c;然后总结了本指南中分享的 9 个有效选项。您可…

生成JavaDoc文档

生成 JavaDoc 文档 1、快速生成 文档 注解 2、常见的文档注解 3、脚本生成 doc 文档 4、IDEA工具栏生成 doc 文档 第一章 快速入门 第01节 使用插件 在插件工具当中&#xff0c;找到插件 javaDoc 使用方式&#xff0c;在代码区域&#xff0c;直接点击右键。选择 第02节 常用注…

Web后端基础(Maven基础)

https://blog.csdn.net/q20202828/article/details/148459525?spm1001.2014.3001.5501 这是我总结了一下aliyun私服maven依赖配置Maven 3.9.1下载安装的操作 Maven的作用 统一项目结构 Maven 还提供了标准、统一的项目结构 。 1). 未使用Maven 由于java的开发工具呢&#x…

set map数据结构

#include <set> #include <iostream> using namespace std;int main() {// 设置控制台输出编码为UTF-8system("chcp 65001");set<int> s1; // 创建一个整数集合// 插入元素s1.insert(5);s1.insert(3);s1.insert(7);s1.insert(1);s1.insert(9);//默…

面试题小结(真实面试)

面试题 1.call与apply的区别2.vue3的响应式原理3.js的垃圾回收机制4.说说原型链5.什么是防抖和节流6.说一下作用域链7.在一个页面加载数据时&#xff08;还没加载完成&#xff09;&#xff0c;切换到另一个页面&#xff0c;怎么暂停之前页面的数据加载。 浏览器自动中止机制 这…

计算机网络领域所有CCF-A/B/C类期刊汇总!

本期小编统计了【计算机网络】领域CCF推荐所有期刊的最新影响因子&#xff0c;分区、年发文量以及投稿经验&#xff0c;供大家参考&#xff01; CCF-A类 1 IEEE Journal on Selected Areas in Communications 【影响因子】13.8 【期刊分区】JCR1区&#xff0c;中科院1区TOP …