☰
华为OD机试真题 新系统 2026-09-13 PythonJS【手机桌面整理】
2026/9/28 5:13:48 网站建设 项目流程

目录

题目

思路

Code

题目

题目内容:

手机系统维护一个 App 列表,列表按最近操作顺序排列,最前面是最近操作的 App。

OPEN name:若 App 已存在,将其移到列表最前面,打开次数加 1,并返回当前打开次数;若不存在,返回 -1。

INSTALL name:若 App 已存在,只将其移到列表最前面,打开次数不变;若不存在,将其安装到最前面并把打开次数设为 0。列表已满时,先卸载最久未使用的 App。INSTALL 不产生返回值。

UNINSTALL name:若 App 已存在,将其移除并返回累计打开次数;若不存在,返回 -1。

请按操作顺序收集所有 OPEN 和 UNINSTALL 的返回值。

0 ≤ capacity ≤ 1000,操作数为 1 至 1000。App 名称由英文字母或数字组成,区分大小写,长度为 1 至 20。

输入描述:

第一行输入桌面容量 capacity。

后续每行输入一条操作指令,直到文件结束。指令格式为操作名、一个空格和 App 名称。

输出描述:

输出一个整数数组,按发生顺序记录所有 OPEN 和 UNINSTALL 操作的返回值。INSTALL 不写入数组。

样例 1

以下样例按公开题意构造,不冒充公开页面被截断的原样例。

输入:

2 INSTALL A OPEN A INSTALL B OPEN A UNINSTALL B

输出:

[1,2,0]

样例 2

以下样例按公开题意构造。

输入:

1 INSTALL A INSTALL B OPEN A OPEN B

输出:

[-1,1]

思路

整体思路:同时维护 App 的最近操作顺序和累计打开次数。顺序表头表示最近操作,表尾表示最久未使用。

第一步:OPEN 命中时把次数加 1 并移动到表头;未命中时只记录 -1,不改变列表。

第二步:INSTALL 命中时只移动位置;未命中时先检查容量,满容量就删除表尾,再把新 App 以次数 0 插入表头。

第三步:UNINSTALL 命中时先记录当前次数再删除;未命中时记录 -1。只有 OPEN 和 UNINSTALL 产生输出。

第四步:容量为 0 时任何 App 都不能保留,INSTALL 不产生状态,后续 OPEN 和 UNINSTALL 都按不存在处理。

正确性说明:每种操作都严格按题目更新列表位置与计数;表头到表尾始终保持最近到最久的顺序,因此满容量时删除表尾恰好淘汰最久未使用的 App。

边界处理:支持零容量、重复安装、重复打开、卸载后再次访问、大小写不同的名称和空返回数组。

复杂度分析:采用链表加映射时每次操作可达 O(1);部分语言为保持实现直观使用长度最多 1000 的顺序数组,单次 O(capacity),仍满足公开规模。

Code

import sys def move_to_front(order: list[str], name: str) -> None: # order 从前到后保存最近到最久使用的 App;删除后插到下标 0 可恢复该不变量。 order.remove(name) order.insert(0, name) lines = [line.strip() for line in sys.stdin.read().splitlines() if line.strip()] capacity = int(lines[0]) operations = lines[1:] order: list[str] = [] open_counts: dict[str, int] = {} answers: list[int] = [] for operation in operations: action, name = operation.split(maxsplit=1) if action == "OPEN": if name not in open_counts: answers.append(-1) continue open_counts[name] += 1 move_to_front(order, name) answers.append(open_counts[name]) elif action == "INSTALL": if name in open_counts: move_to_front(order, name) continue # 容量为 0 时桌面不能容纳 App,安装操作按无返回值处理。 if capacity == 0: continue if len(order) == capacity: expired = order.pop() del open_counts[expired] order.insert(0, name) open_counts[name] = 0 else: if name not in open_counts: answers.append(-1) continue answers.append(open_counts.pop(name)) order.remove(name) # 只收集 OPEN 和 UNINSTALL 的返回值,INSTALL 不占输出位置。 # 输入首行是容量,后续循环逐条读取操作;名称区分大小写,计数状态只属于当前已安装的 App。 # 每个操作分支都同时维护顺序集合和次数映射,避免淘汰或卸载后留下可再次命中的旧状态。 # 答案数组只记录 OPEN 与 UNINSTALL 的返回值,最终输出顺序必须与输入操作发生顺序一致。 print("[" + ",".join(map(str, answers)) + "]")

JS

const fs = require("fs"); const lines = fs.readFileSync(0, "utf8").split(/\r?\n/).map( (line) => line.trim() ).filter(Boolean); const capacity = Number(lines[0]); // order 从前到后表示最近到最久操作,counts 保存每个已安装 App 的累计打开次数。 const order = []; const counts = new Map(); const answers = []; function moveToFront(name) { const index = order.indexOf(name); order.splice(index, 1); order.unshift(name); } for (const operation of lines.slice(1)) { const space = operation.indexOf(" "); const action = operation.slice(0, space); const name = operation.slice(space + 1).trim(); if (action === "OPEN") { if (!counts.has(name)) { answers.push(-1); continue; } counts.set(name, counts.get(name) + 1); moveToFront(name); answers.push(counts.get(name)); } else if (action === "INSTALL") { if (counts.has(name)) { moveToFront(name); continue; } // 容量为 0 时安装无法落入列表,且 INSTALL 本身没有返回值。 if (capacity === 0) { continue; } if (order.length === capacity) { counts.delete(order.pop()); } order.unshift(name); counts.set(name, 0); } else { if (!counts.has(name)) { answers.push(-1); continue; } answers.push(counts.get(name)); counts.delete(name); order.splice(order.indexOf(name), 1); } } // JSON.stringify 产生题目要求的紧凑数组,且自然覆盖无返回值时的空数组。 // 输入首行是容量,后续循环逐条读取操作;名称区分大小写,计数状态只属于当前已安装的 App。 // 每个操作分支都同时维护顺序集合和次数映射,避免淘汰或卸载后留下可再次命中的旧状态。 // 答案数组只记录 OPEN 与 UNINSTALL 的返回值,最终输出顺序必须与输入操作发生顺序一致。 console.log(JSON.stringify(answers));

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】

华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询