当前位置: 首页 > news >正文

华为OD机试真题 - 支持优先级队列 (C++ Python JAVA JS GO)

支持优先级队列

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

实现一个支持优先级的队列,高优先级先出队列;同优先级时先进先出。

如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。

队列存储的数据内容是一个整数。

输入描述

一组待存入队列的数据 (包含内容和优先级)

备注

不用考虑输入数据不合法的情况,测试数据不超过100个

输出描述

队列的数据内容(优先级信息输出时不再体现)

用例1

输入

(10,1),(20,1),(30,2),(40,3)

输出

40,30,10,20

说明

输入样例中,向队列写入了4个数据,每个数据由数据内容和优先级组成。
数据40的优先级最高,所以最先输出,其次是30;

10和20优先级相同,所以按输入顺序输出。

用例2

输入

(10,1),(10,1),(30,2),(40,3)

输出

40,30,10

说明

输入样例中,向队列写入了4个数据,每个数据由数据内容和优先级组成。

数据40的优先级最高,所以最先输出,其次是30;

两个10和10构成重复数据,被丢弃一个。

题解

思路:模拟

  1. 使用哈希表按优先级分类存储每个优先级顺序出现数字的数组。
  2. 至于每个优先级出现的数字去重可以使用一个哈希表按优先级分类保存一个集合用于去重。
  3. 接下里就是正常处理,这部分比较简单可以参照下面逻辑。
  4. 然后高优先级的数组先输出,低优先级数组后输出就行。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> #include<set> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<string> split(const string& str, const string& delimiter) { vector<string> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(str.substr(start, end - start)); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { string input; getline(cin, input); // 解析输入,(10,1),(20,1),(30,2) = > 10,1),(20,1),(30,2 input = input.substr(1, input.size() - 2); vector<string> num = split(input, "),("); // 记录出现过的优先级 set<int> priority; // 记录同一优先级按顺序出现数字 map<int, vector<int>> priorityNum; // 记录同一优先级已经出现数字 map<int, set<int>> priorityCountNum; int n = num.size(); for (int i = 0; i < n; i++) { string st = num[i]; vector<string> tmp = split(st, ","); int value = stoi(tmp[0]); int pri = stoi(tmp[1]); priority.insert(pri); // 已经存在,跳过 if (priorityCountNum[pri].count(value)) { continue; } priorityCountNum[pri].insert(value); priorityNum[pri].push_back(value); } vector<int> priorityArr(priority.begin(), priority.end()); // 降序 sort(priorityArr.rbegin(), priorityArr.rend()); vector<int> result; // 记录结果输出顺序 for (int i = 0; i < priorityArr.size(); i++) { int priority = priorityArr[i]; for (auto& value : priorityNum[priority]) { result.push_back(value); } } // 输出结果 for (int i = 0; i < result.size(); i++) { if (i !=0) { cout << ","; } cout << result[i]; } return 0; }

JAVA

import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); // 去掉首尾括号 input = input.substring(1, input.length() - 1); // 按 "),(" 分割 String[] parts = input.split("\\),\\("); // 记录出现过的优先级 Set<Integer> prioritySet = new HashSet<>(); // 记录同一优先级下按顺序出现的数字 Map<Integer, List<Integer>> priorityNum = new HashMap<>(); // 记录同一优先级下已经出现过的数字(去重) Map<Integer, Set<Integer>> priorityCountNum = new HashMap<>(); for (String part : parts) { String[] tmp = part.split(","); int value = Integer.parseInt(tmp[0]); int pri = Integer.parseInt(tmp[1]); prioritySet.add(pri); priorityCountNum.putIfAbsent(pri, new HashSet<>()); priorityNum.putIfAbsent(pri, new ArrayList<>()); // 已出现过则跳过 if (priorityCountNum.get(pri).contains(value)) { continue; } priorityCountNum.get(pri).add(value); priorityNum.get(pri).add(value); } // 优先级降序排列 List<Integer> priorityArr = new ArrayList<>(prioritySet); priorityArr.sort(Collections.reverseOrder()); // 输出结果 StringBuilder sb = new StringBuilder(); boolean first = true; for (int pri : priorityArr) { for (int value : priorityNum.get(pri)) { if (!first) sb.append(","); sb.append(value); first = false; } } System.out.println(sb.toString()); } }

Python

importsysdefmain():input_str=sys.stdin.readline().strip()# 去掉首尾括号input_str=input_str[1:-1]# 按 "),(" 分割parts=input_str.split("),(")# 记录出现过的优先级priority_set=set()# 记录同一优先级按顺序出现的数字priority_num={}# 记录同一优先级已出现的数字(去重)priority_count_num={}forpartinparts:value_str,pri_str=part.split(",")value=int(value_str)pri=int(pri_str)priority_set.add(pri)ifprinotinpriority_num:priority_num[pri]=[]priority_count_num[pri]=set()# 已出现过则跳过ifvalueinpriority_count_num[pri]:continuepriority_count_num[pri].add(value)priority_num[pri].append(value)# 优先级降序priority_arr=sorted(priority_set,reverse=True)# 输出结果result=[]forpriinpriority_arr:result.extend(priority_num[pri])print(",".join(map(str,result)))if__name__=="__main__":main()

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput='';rl.on('line',line=>{input=line.trim();});rl.on('close',()=>{// 去掉首尾括号input=input.substring(1,input.length-1);// 按 "),(" 分割constparts=input.split("),(");// 记录出现过的优先级constprioritySet=newSet();// 同一优先级下的数字(保持顺序)constpriorityNum=newMap();// 同一优先级已出现的数字(去重)constpriorityCountNum=newMap();for(constpartofparts){const[valueStr,priStr]=part.split(",");constvalue=Number(valueStr);constpri=Number(priStr);prioritySet.add(pri);if(!priorityNum.has(pri)){priorityNum.set(pri,[]);priorityCountNum.set(pri,newSet());}// 已出现过则跳过if(priorityCountNum.get(pri).has(value)){continue;}priorityCountNum.get(pri).add(value);priorityNum.get(pri).push(value);}// 优先级降序constpriorityArr=Array.from(prioritySet).sort((a,b)=>b-a);// 输出结果letresult=[];for(constpriofpriorityArr){result.push(...priorityNum.get(pri));}console.log(result.join(","));});

Go

packagemainimport("bufio""fmt""os""sort""strings")funcmain(){in:=bufio.NewReader(os.Stdin)input,_:=in.ReadString('\n')input=strings.TrimSpace(input)// 去掉首尾括号input=input[1:len(input)-1]// 按 "),(" 分割parts:=strings.Split(input,"),(")// 记录出现过的优先级prioritySet:=make(map[int]bool)// 记录同一优先级按顺序出现的数字priorityNum:=make(map[int][]int)// 记录同一优先级已出现的数字(去重)priorityCountNum:=make(map[int]map[int]bool)for_,part:=rangeparts{tmp:=strings.Split(part,",")varvalue,priintfmt.Sscanf(tmp[0],"%d",&value)fmt.Sscanf(tmp[1],"%d",&pri)prioritySet[pri]=trueif_,ok:=priorityNum[pri];!ok{priorityNum[pri]=[]int{}priorityCountNum[pri]=make(map[int]bool)}// 已出现过则跳过ifpriorityCountNum[pri][value]{continue}priorityCountNum[pri][value]=truepriorityNum[pri]=append(priorityNum[pri],value)}// 优先级降序priorityArr:=make([]int,0)forpri:=rangeprioritySet{priorityArr=append(priorityArr,pri)}sort.Sort(sort.Reverse(sort.IntSlice(priorityArr)))// 输出结果first:=truefor_,pri:=rangepriorityArr{for_,value:=rangepriorityNum[pri]{if!first{fmt.Print(",")}fmt.Print(value)first=false}}}
http://www.cnnetsun.cn/news/422802.html

相关文章:

  • 【Spring源码】getBean源码实战(七)——BeanPostProcessor与初始化方法
  • Java分页查询方式总结
  • Android 16安兔兔分辨率作假显示(非修改TextView方案)
  • typora快速下载(简单易学)
  • laravel的session_start(); 是在哪里调用的?
  • OpenAI重组团队开发语音AI硬件产品,2026年推出新模型
  • AI重塑工作格局:Mercor如何连接人才与智能体训练
  • Windows系统文件找不到的问题 如何下载文件修复?
  • 使用电脑Win系统时经常会出现丢失找不到某些文件的情况
  • 2024年五大颠覆性技术趋势
  • 托盘目标检测数据集VOC+YOLO格式4517张1类别
  • 大模型开发必备!一张图看懂AI Agent!五层架构深度剖析,从Prompt到Action的完整闭环
  • 未来已来!Android Studio的AI Agent让编程变得如此简单,开发者:这比antigravity还牛!小白也能秒变大神,不会你就真的out了!
  • springboot+vue电影推荐系统springboot协同过滤
  • 基于非对称纳什谈判的多微网电能共享运行优化:MATLAB 实现探秘
  • 笔记本外接屏突然黑屏?我踩了 3 个坑,最后靠回退 N 卡驱动救了急
  • 2025年APP开发公司口碑排行榜单权威发布
  • 开关电流降压型DC-DC转换器D7015解析
  • 网站没有安装SSL证书会有影响吗?
  • 学长亲荐9个AI论文网站,助你轻松搞定本科论文!
  • AI 把内容做成了 “泔水”,但你的 “人味儿” 正在变贵
  • PID控制算法十年演进(2015–2025)
  • 大数据管理基础薄弱怕校招?AI技能学习补短板,校招轻松突围
  • ssm vue企业退休人员管理系统
  • 前后端校验,如何分工
  • ssm社区宠物信息管理系统vue
  • 常见4K HDR信号的视频格式HLG或PQ映射
  • 云原生核心概念和行业解决方案(未完待续)
  • ShaderGraph:流光镭射+圆角 卡片
  • 基于springboot框架的保险业务管理系统vue