做了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 };