华为 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 };
相关推荐
swipe10 小时前
从 0 到 1 实现大文件上传:分片、秒传、断点续传、暂停、重试与服务端合并
前端·javascript·面试
kyriewen12 小时前
AI 生成的代码能跑就行?这 5 个坑迟早炸
前端·javascript·ai编程
kisshyshy12 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
胡志辉12 小时前
从v8源码和react深入浅出理解 JavaScript 作用域链与闭包
前端·javascript
Bolt13 小时前
TypeScript 7.0 来了:当 tsc 用 Go 重写之后
javascript·typescript·go
阳火锅14 小时前
😭测试小姐姐终于不骂我了!这个提BUG神器太香了...
前端·javascript·面试
林希_Rachel_傻希希16 小时前
js里面的proxy理解。以及vue3响应式数据设计底层
前端·javascript·面试
阿黎梨梨16 小时前
AI Loop:告别“人肉写提示词”,让代码替你“鞭策”AI
javascript·人工智能
竹林81820 小时前
用 wagmi v2 + viem 监听链上事件,我踩了三天坑终于搞懂了实时日志与历史补全
javascript
只一20 小时前
😭从回调地狱到 async/await:一文打通 Ajax 与 JS 异步编程
javascript