华为 OD 2026年5月笔试题解析

做了od的笔试题,本人太菜就做了前两道较简单的题目,这里记录一下;

第一题:链表数字队列重排(节点分类)

题目描述

给定一个由多个节点组成的单向链表 ,每个节点包含一个正整数 val,代表排队人员的编号。现在需要按照以下规则对队列进行筛选和重新排序:

  • 若 val 是 3 的倍数 ,直接将该节点从队列中删除。

  • 若 val 不满足规则 1,但其数字中包含字符 2 ,则将该节点移动到队列末尾。

  • 若 val 不满足规则 1 和 2,但其数字中包含字符 `3 ,则将该节点移动到队列头部。

  • 其他节点,以及被移动到头部或尾部的同类节点之间,必须保持原本的相对顺序。

输入要求

  • 传入一个单链表的头节点 head。

  • 节点数最大可达 10510^5105,节点值最大可达 10910^9109。

输出要求

  • 输出重排后的最终队列,所有节点的 val 按照顺序组合成一个用空格隔开的字符串。

  • 如果输入链表为空或存在不合法数据,返回 -1。

解题思路

使用三个数组分别收集需要移动到头部、保留在中间、移动到尾部的节点值,既能实现 O(n)O(n)O(n) 的分类,又能完美保持每一类内部的相对顺序。

AC 代码(JavaScript)

javascript 复制代码
function ListNode(x) {
    this.val = x;
    this.next = null;
}

/**
 * @param {ListNode} head - 链表头指针
 * @return {string}
 */
function playNumberGame(head) {
    if (head === null) return "-1";

    let size = 0;
    let headArr = [];  // 包含 '2' 的节点 → 移到头部
    let midArr = [];   // 普通节点 → 保留原位
    let tailArr = [];  // 包含 '3' 的节点 → 移到尾部

    let cur = head;

    while (cur) {
        if (cur.val > 1000000000 || size > 100000) return "-1";

        let val = cur.val;
        let valStr = String(val);

        if (val % 3 === 0) {
            // 规则 1:3 的倍数直接丢弃
        } else if (valStr.includes('3')) {
            // 规则 2:包含 3 → 尾部
            tailArr.push(val);
        } else if (valStr.includes('2')) {
            // 规则 3:包含 2 → 头部(push 保持相对顺序)
            headArr.push(val);
        } else {
            // 规则 4:普通节点保留
            midArr.push(val);
        }

        cur = cur.next;
        size++;
    }

    return [...headArr, ...midArr, ...tailArr].join(' ');
}

module.exports = { playNumberGame };

第二题:企业组织架构的最小层级(完全二叉树最大深度)

题目描述

给定一个一维字符串数组 departments,表示某企业最上层的组织架构。该数组实际上是在用完全二叉树的方式表示各部门的层级关系:

  • 根部门在位置 1(数组索引 0)。

  • 对于位置在 iii 的部门,其左子部门的位置在 2i2i2i,右子部门的位置在 2i+12i + 12i+1。

  • 数组中若某个值为 "#",则代表该组织层级不存在(即空节点)。

请计算并返回该企业组织架构的最大层级(即二叉树的最大深度)。

输入要求

  • 一个一维字符串数组,长度最大为 10510^5105。

  • 示例:["1", "#", "2", "#", "3", "#", "4", "#", "5", "#", "6"]

输出要求

  • 一个整数,代表组织的最大层级。

解题思路

利用完全二叉树的索引性质,从根节点(编号 1)开始进行 DFS 递归。对于编号 iii 的节点,左孩子为 2i2i2i,右孩子为 2i+12i+12i+1,当索引越界或节点为 "#" 时返回 0。

AC 代码(JavaScript)

javascript 复制代码
/**
 * @param {string[]} departments
 * @return {number}
 */
function maxDepth(departments) {
    if (!departments || departments.length === 0) return 0;

    const dfs = (index) => {
        if (index > departments.length) return 0;

        let cur = departments[index - 1];
        if (cur === "#" || cur === undefined) return 0;

        let leftDepth = dfs(index * 2);
        let rightDepth = dfs(index * 2 + 1);

        return Math.max(leftDepth, rightDepth) + 1;
    };

    return dfs(1);
}

module.exports = { maxDepth };
相关推荐
KevinChaos12 小时前
阳台小花园开发手记 04|HarmonyOS 7.0 互动卡片:倾斜手机时的卡片效果
华为·harmonyos
1-1=012 小时前
Vue 3 模板语
前端·javascript·vue.js
风卿12 小时前
看着AI写代码太孤独了,来欣赏星云吧:一个DSH 装饰插件
前端·javascript
牧艺13 小时前
弹层不用再手算坐标了:CSS Anchor Positioning 从原理到可上线
前端·javascript·css
愚坤14 小时前
前端真有意思,JS还能独立做项目?
前端·javascript·github
李纲明15 小时前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
FungLeo16 小时前
成为全栈·Vue 管理后台篇·用 fetch 建一层可控的请求内核
前端·javascript·vue.js·http·fetch·formdata·接口封装
用户842981424181017 小时前
ByteJS,让重要的 JavaScript 以字节码运行。
javascript
FungLeo18 小时前
成为全栈·Vue 管理后台篇·Vue Router如何守住多角色后台边界
前端·javascript·vue.js·rbac·vue router·路由守卫·前端权限
FungLeo19 小时前
成为全栈·Vue管理后台篇·仪表盘不是几张卡片:组合统计接口与角色视图
前端·javascript·vue.js·rbac·仪表盘·管理后台·tanstack query