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

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

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

题目描述

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

  • val3 的倍数 ,直接将该节点从队列中删除

  • 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 };
相关推荐
无风听海1 小时前
Promise 与 Async Await 深度解析
前端·javascript
橘子味的冰淇淋~2 小时前
优化前端性能之从“全局引入”改为“按需引入”
前端·javascript·vue.js
yuegu7772 小时前
HarmonyOS应用<节气通>开发第4篇:TabBar导航实现
华为·harmonyos
Vennn2 小时前
Android自动化:使用 Web 方式实现某音未读消息检查与采集
前端·javascript·vue.js
Smilezyl2 小时前
为了搞懂 AI Agent,我用 6000 行 JS 代码手搓了一个零依赖的 Coding Agent
前端·javascript·github
掰头战士2 小时前
搞定JavaScript类型判断,一文就够了
javascript
周凡1233 小时前
AI 时代的 Web JavaScript 逆向分析实践与思考
前端·javascript·人工智能
nashane3 小时前
HarmonyOS 6学习:深入解析CustomDialog嵌套弹窗中的this指向陷阱与解决方案
学习·华为·harmonyos
zhoumeina993 小时前
分段创建产品,tab 页切换又要保留缓存
前端·javascript