华为OD机试_2025 B卷_数组去重和排序(Python,100分)(附详细解题思路)
题目描述
给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。
输入描述
一个数组
输出描述
去重排序后的数组
用例
输入 | 1,3,3,3,2,4,4,4,5 |
输出 | 3,4,1,2,5 |
备注 | 数组大小不超过100 数组元素值大小不超过100。 |
数组去重排序:按频次与顺序的艺术
核心解题思路
这道题的核心在于同时解决两个问题:去重和特殊排序。我们需要:
- 删除重复元素:每个元素只保留一个
- 按出现频次排序:出现次数多的元素排前面
- 频次相同时按首次出现顺序排序:保持原始先后关系
关键技巧:
- 使用字典记录元素的出现次数和首次出现位置
- 分阶段处理:先统计信息,再排序输出
- 利用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))
关键特性分析
- 稳定去重:保留每个元素的首次出现
- 排序准确性:
- 高频元素优先排列
- 相同频次元素按原始顺序排列
- 效率优化:
- 时间复杂度:O(n log n)(主要来自排序)
- 空间复杂度:O(n)(存储元素信息和去重集合)
- 边界处理:
- 空输入处理:默认返回空列表
- 单元素数组:直接返回该元素
算法原理解析
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] # 首次位置升序)
)
原理说明:
- 双条件排序:
- 主要条件:出现频次降序(高频优先)
- 次要条件:首次出现位置升序(位置小优先)
- 负号技巧:
-频次
实现降序排序(避免使用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” | 1 | 0 | (-1, 0) → (-1,0) |
“3” | 3 | 1 | (-3, 1) → (-3,1) |
“2” | 1 | 4 | (-1, 4) → (-1,4) |
“4” | 3 | 5 | (-3, 5) → (-3,5) |
“5” | 1 | 8 | (-1, 8) → (-1,8) |
排序规则:
-
比较元组第一个元素(负频次):
- “3"和"4”:-3(频次3)优先于-1(频次1)
- “1”、“2”、“5”:都是-1,需要进一步比较
-
比较元组第二个元素(位置):
- “3”(位置1) vs “4”(位置5):1<5 → "3"排在"4"前
- “1”(位置0) vs “2”(位置4) vs “5”(位置8):0<4<8 → “1”、“2”、"5"顺序不变
最终排序顺序:
- “3”(频次最高,位置最小)
- “4”(频次最高,位置较大)
- “1”(频次低,位置最小)
- “2”(频次低,位置中等)
- “5”(频次低,位置最大)
输出结果:
3,4,1,2,5
算法变通应用
这种方法可广泛应用于:
- 用户行为分析:找出高频操作序列
- 日志分析:统计高频错误及其首次发生时间
- 推荐系统:按物品流行度和新鲜度排序
- 数据清洗:去除重复记录并保留原始版本
通过这道题,我们掌握了处理多条件排序问题的核心技巧:分阶段收集信息 → 明确排序优先级 → 利用语言特性实现排序逻辑。这种思路可以延伸到各种复杂排序场景中。
相关文章:
华为OD机试_2025 B卷_数组去重和排序(Python,100分)(附详细解题思路)
题目描述 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序。 输入描述 一个数组 输出描述 去重排序后的数组 用例 输入1,3,…...

云计算 Linux Rocky day03(which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep)
云计算 Linux Rocky day03(which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep) 目录 云计算 Linux Rocky day03(which、快捷键、mount、家目录、ls、alias、mkdir、rm、mv、cp、grep)1.which找到命令所对应的程序…...
gh hugging face使用
install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…...
SQL Server全局搜索:在整个数据库中查找特定值的高效方法
SQL Server全局搜索:在整个数据库中查找特定值的高效方法 一、需求背景:为什么需要数据库全局搜索? 在数据库管理和开发过程中,我们经常会遇到这样的场景: 只记得某个数据值,但忘记了它所在的表或列需要…...

JVM 内存溢出 详解
内存溢出 内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。 在Java虚拟机中,只有程序计数器不会出现内存溢出的情况,因为每个线程的程序计数器只保…...
Qt 5.12 上读取 .xlsx 文件(Windows 平台)
推荐最优方案:使用 QXlsx 库 QXlsx 是一个基于 Qt 的开源库,专门用于读写 .xlsx 文件,适用于 Qt 5.12,且无需依赖 Microsoft Excel 或 COM 对象。以下是其优势与实现步骤: 优势 跨平台:QXlsx 不依赖 Mic…...

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

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

传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。
传统的将自然语言转化为嵌入向量的核心机制是:,将离散的语言符号转化为连续的语义向量,其核心依赖“上下文决定语义”的假设和神经网络的特征提取能力。 传统的将自然语言转化为嵌入向量(Word Embedding)的核心机制是分布式语义假设(Distributional Semantics Hypothesis…...
【前端】每日一道面试题6:解释Promise.any和Promise.allSettled的使用场景及区别。
Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于处理异步操作的两种不同策略的 Promise 组合器,它们的核心区别在于逻辑目标与结果处理方式: 1. Promise.any() 使用场景: 需要获取 首个成功结果(类似竞速成功优先&…...
wordpress+woocommerce电商平台搭建方案的优势分析
以下是WordPress WooCommerce电商平台搭建方案的优势分析: 技术架构与功能扩展优势 强大的插件生态系统:WordPress拥有超过58000个插件,WooCommerce作为其中最受欢迎的电商插件,提供了丰富的功能扩展选项,如支持超过…...

玄机-日志分析-IIS日志分析
1.phpstudy-2018站点日志.(.log文件)所在路径,提供绝对路径 2.系统web日志中状态码为200请求的数量是多少 3.系统web日志中出现了多少种请求方法 4.存在文件上传漏洞的路径是什么(flag{/xxxxx/xxxxx/xxxxxx.xxx} 5.攻击者上传并且利用成功的webshell的文件名是什…...
IDEA:配置 Git 需要完成 Git 路径设置、账号认证以及仓库关联三个主要步骤
一、验证 Git 是否已安装 检查 Git 版本(Windows/Linux/Mac): 打开终端 / 命令提示符,输入: git --version若未安装,下载并安装 Git 二、在 IDEA 中配置 Git 路径 打开设置: Windows/Linux&a…...
PHP 复制商品扩展实操:轻松切换一号通、99api ,实现商品复制功能
目前已有一号通、99api复制商品扩展 复制商品扩展入口 namespace crmeb\services\copyproduct;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\facade\Config; use think\Container;/*** Class Product* package crmeb\services\copyp…...

【办公类-104-01】20250606通义万相50分一天用完,通义万相2.1专业版测试
背景需求: 昨天打开通义万相,发现分数降低到3位数,原来时1500.仔细看,原来每天的50分,只有1天有效期了。 用掉试试,用的是之前的30天积分,还是今天的1天积分 纯白色背景,卡通简笔画…...
Prompt Engineering Notes
TOC LLM output configurationOutput length LLM output configuration Output length 仅仅起到截断作用,不会让模型的输出更简洁。...
C++课设:学生成绩管理系统
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目功能概览1. 核心功能模块2. 系统特色亮点3. 完整代码4. 运行演示二、核心结构设计1. 系统架构设计2. Stud…...

制作个人Github学术主页
1.fork一个模板 从模板网站Jekyll Themes fork一个模板,并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮,修改Branch为master /root 然后点击save ,等待一会后刷新,便会生成一个新的site。 3.…...
【Linux内核】设备模型之udev技术详解
目录 1. udev技术概述 2. 技术层次分析 2.1 内核层交互 2.2 规则引擎层 2.3 用户空间实现 3. 关键技术要点 3.1 动态设备节点管理 3.2 热插拔处理 3.3 模块化规则系统 3.3.1. 变量替换功能 3.3.2. 条件判断能力 3.3.3. 实现机制 3.3.4 应用场景 3.3.5 扩展能力 4…...

FineReport模板认证找不到模板
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 1.现象及排查过程2. 解决办法 1.现象及排查过程 FR模板认证下面找不到模板 由于是集群部署的FR,所以后台查看了sftp服务器,测试连接,连接成功。 但是…...
STM32实战:数字音频播放器开发指南
基于STM32的数字音频播放器/效果器是个很棒的项目!这涉及到多个嵌入式开发的关键技术点。下面我为你拆解实现方案和关键学习内容: 系统架构概览 [SD Card] -> [File System (FATFS)] -> [Audio Decoder (WAV/MP3)] -> [DSP Processing (EQ, R…...
豆包和deepseek 元宝 百度ai区别是什么
豆包、DeepSeek、元宝和百度 AI 有以下区别: 开发公司 豆包5:由字节跳动公司基于云雀模型开发。DeepSeek4:是深度求索打造的开源多模态大模型。元宝1:是腾讯混元模型的落地产品,整合了 DeepSeek - R1 与混元模型。百…...

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

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

pikachu靶场通关笔记16 CSRF关卡02-CSRF(POST)
目录 一、CSRF原理 二、源码分析 三、渗透实战 1、构造CSRF链接 (1)登录 (2)bp设置inception on (3)修改个人信息 (4)构造CSRF链接 2、模拟受害者登录 3、诱导受害者点击 …...
场景题-3
如何实现一个消息队列 拆解分析主流的几种消息队列 1、基本架构 生产者Producer、消费者Consumer、Broker:生产者发送消息,消费者接受消息,Broker是服务端,处理消息的存储、备份、删除和消费关系的维护。 主题和分区ÿ…...
Java 类型参数 T、R 、 O 、K、V 、E 、? 区别
在 Java 泛型和函数式编程中,T、R 和 O 都是类型参数(Type Parameters),它们的主要区别在于命名约定和上下文含义,而不是语言层面的区别。它们可以互换使用,但通常遵循一定的命名习惯以提高代码可读性。 1.…...

中医的十问歌和脉象分类
中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指,实际包含12个核心问题,脉象28种中常见仅10余种,重点解释脉诊的物理本质(血流动力学触觉感知) 以下是中医十问歌的完整内容及脉…...
C#封装HttpClient:HTTP请求处理最佳实践
C#封装HttpClient:HTTP请求处理最佳实践 在现代的.NET应用程序开发中,与外部服务进行HTTP通信是一项常见需求。HttpClient作为.NET框架中处理HTTP请求的核心组件,为我们提供了强大而灵活的API。然而,直接使用原生的HttpClient可能…...
前端基础之《Vue(19)—状态管理》
一、什么是状态管理 1、Vue版本问题 Vue2 Vuex3 Vue3 Vuex4 / Pinia2 在使用任何技术的时候,都先要去搜索一下版本,你的版本和脚手架环境是否兼容。 2、安装Vuex yarn add vuex3.6.2 3、状态管理 状态,在应用程序中表示数据,…...