华为 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 };
相关推荐
感谢一路走过的人几秒前
AGGrid刷新数据后执行筛选
javascript·ag-grid
水獭比特12 分钟前
工具都批准了,为什么还不能执行?给 Agent 补上第二道校验
javascript·人工智能·node.js
夏雪coding1 小时前
JeecgBoot 动态路由踩坑(Vue2):刷新白屏、permissionList[0] 报 undefined,以及我最后为什么全删了
javascript·vue.js
默_笙1 小时前
😋 我让爬虫终于看到了我的网站,后端同事说"这也行?"(上):SEO 与渲染模式
前端·javascript
2501_919749031 小时前
华为鸿蒙记录怀孕APP—小羊怀孕
华为·harmonyos·鸿蒙
七牛开发者3 小时前
解读 Cordis:dsh 一切皆插件背后的运行时设计
前端·javascript·后端
YM52e3 小时前
鸿蒙 ArkTS 实战|网络常用漫剧主角名称分类表:26 位主角 8 大分类 + 搜索筛选
学习·华为·harmonyos
雷工笔记3 小时前
KingFusion驾驶舱-产能信息模块开发实战
javascript
小雨青年3 小时前
【HarmonyOS 7 悬浮页签深度实战】02 从普通底栏到第一个悬浮页签
华为·harmonyos
小弥儿6 小时前
GPT Image 2 提示词库,把散落的生图提示词变成工程资产
开发语言·javascript·gpt·学习