华为 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 };
相关推荐
解局易否结局6 小时前
鸿蒙原生开发实战:用 Native C++ 与 OpenGL ES 构建高性能图形渲染管线
c++·elasticsearch·华为·harmonyos
ZZZMMM.zip6 小时前
鸿蒙生态新征程:基于鸿蒙Flutter框架的AI菜谱营养应用深度解析
人工智能·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
用户298698530146 小时前
在 React 中拆分 Excel 文件:从工作表到行列的实践
javascript·react.js·excel
想要成为糕糕手6 小时前
238. 除了自身以外数组的乘积 — 面试向深度解析
javascript·算法·面试
kisshyshy6 小时前
前端存储、表单异步提交与 this 指向完全指南
前端·javascript·html
Kel7 小时前
管道、IPC、Socket:你以为的三种技术,其实是同一件事
javascript·设计模式·node.js
心中有国也有家7 小时前
AtomGit Flutter 鸿蒙客户端: AnimatedScale 与 AnimatedContainer 联合实战
android·javascript·flutter·华为·harmonyos
嘉泰姆半导体官方7 小时前
CXAR41337C 双通道数字音频功放 | 2×20W | EQ+DRC | I²S | MCLK-Less - 嘉泰姆电子
前端·javascript·数据库
风华圆舞7 小时前
鸿蒙HarmonyOS矩阵加载动效实战 —— 从「假旋转」到可复用的波前反馈组件
华为·矩阵·harmonyos·arkui·gradientspin·波前动效·oklab
胡萝卜术7 小时前
从逐一合并到多路归并:力扣23「合并K个升序链表」的三种解法进化之路
前端·javascript·面试