加载中

NowCoder

文章分类

浏览该分类下的所有文章

60 篇文章 5

NC38 螺旋矩阵

本题要求对任意 m × n 矩阵按顺时针螺旋顺序输出所有元素,数据规模 0 ≤ m,n ≤ 10,元素绝对值 ≤ 100,时间、空间均需 O(mn)。解法采用四个边界指针 left、right、up、down,循环在边界未交叉时依次遍历上边从左至右、右边从上至下、下边从右至左、左边从下至上,并在每次遍历后收缩相应边界,直至完成。代码实现简洁,先排除空矩阵,随后在 while 循环中按上述顺序加入结果列表,满足题目要求。

NC20 数字字符串转化成IP地址

该题要求将仅含数字的字符串切分为四段,使每段在 0~255 范围内,形成合法 IP 地址并返回所有可能组合。长度限制为 0–12,需采用深度优先搜索+回溯遍历所有切割点,剪枝条件包括段长度不超过 3、首位为 0 时只能为单个 0、数值不超过 255。代码使用 `process` 递归遍历,`path` 保存当前分段,满足四段且遍历完字符串时加入结果;`isValid` 实现上述合法性检查。整体空间、时间复杂度均为 O(n!),符合题目要求。

BM51 数组中出现次数超过一半的数字

该题要求在长度为 n 的数组中找出出现次数超过 n/2 的唯一数字,保证必有解且 n ≤ 50000,数值范围 0 < val ≤ 10000。要求时间复杂度 O(n),空间复杂度 O(1)。文中给出一种基于哈希表的实现:遍历数组时统计每个元素的出现次数,一旦某个计数超过 array.length/2 立即返回该元素。示例包括 `[1,2,3,2,2,2,5,4,2]` → 2、`[3,3,3,3,2,2,2]` → 3、`[1]` → 1。

NC100 把字符串转换成整数(atoi)

实现字符串转整数(atoi)功能,要求自行编写 `StrToInt`,不使用库函数。算法步骤:①去除首尾空格;②识别首个非空字符的正负号,默认正;③从符号后连续读取数字构成有效整数,遇非数字即停止;④若无有效数字返回 0;⑤结果超出 32 位有符号整数范围时截断到 `[-2^31, 2^31‑1]`。代码采用先去除空格、判断首字符合法性、记录数字起始位置,并统一以负数形式累加防止溢出,最后根据符号返回相应正负值。示例展示了普通、带空格、含多余字符、无数字及溢出等情况的处理。

NC142 最长重复子串

本文介绍了“最长重复子串”问题的定义与求解方法:在给定仅含小写字母、长度≤10³的字符串中,寻找由两个相同子串连续拼接而成的最长子串,若不存在则返回0。提供的 Java 实现采用枚举子串长度从大到小遍历,并通过逐字符比较检查相邻子串是否相等,时间复杂度 O(n²),空间复杂度 O(1)。示例说明了返回 4("abab")和返回 0 的情况。

NC37 合并区间

文章介绍了“合并区间”题目:给定最多 2×10⁵ 个区间,要求合并所有重叠区间并按起点升序返回,时间复杂度 O(nlogn)、空间复杂度 O(n)。示例展示了相邻区间合并的效果。提供的 Java 解法先对区间按 start、end 排序,然后遍历列表,若当前区间与结果末尾不重叠则直接加入,重叠时更新末尾区间的结束值,实现了高效的合并逻辑并处理空集等特殊情况。

NC41 最长无重复子数组

本文给出“最长无重复子数组”问题的描述与示例,要求在长度≤10⁵的数组中返回连续子数组的最大长度,使其中元素全部不重复。提供的 Java 解法采用滑动窗口结合哈希表记录窗口内元素出现次数:右指针扩展窗口并更新计数,若出现重复则左指针收缩窗口直至所有计数≤1,期间维护最大长度。代码时间复杂度 O(n),空间复杂度 O(m)(m 为不同元素数),能够高效求解该问题。

NC19 连续子数组的最大和

求数组任意子数组(长度≥1)的最大和,要求时间 O(n),空间 O(1)。利用 Kadane 思路:遍历时累计当前子数组和,若前缀和为负则重置为当前元素;同时维护全局最大值。代码示例中通过 `array[i] += Math.max(0, array[i‑1])` 更新累计和,`res` 保存最大和,最终返回 `res`。该算法满足题目约束,适用于正负数混合的任意整数数组。

NC50 链表中的节点每k个一组翻转

本文介绍了“链表每k个节点翻转”问题:在不修改节点值、空间O(1)、时间O(n)的限制下,将链表按k为一组逆序,若不足k则保持原序。给出示例及边界情况。核心思路是先检查当前段是否至少有k个节点,若不足直接返回;否则使用迭代逆转当前k段节点,逆转后递归处理后续子链表,并将原段首节点连接到递归返回的子链表头。代码实现简洁,利用指针pre、cur、tail完成局部翻转并递归链接。

NC68 跳台阶

该题要求计算青蛙爬上 n 级台阶的跳法数,青蛙每次可跳 1 级或 2 级,跳法顺序不同视为不同。n 的取值在 1‒40,要求时间 O(n)、空间 O(1)。实际上跳法数等同斐波那契数列,第 n 项可由 dp[i]=dp[i‑1]+dp[i‑2] 递推得到。示例:n=2 时答案 2,n=7 时答案 21。文中给出一种基于数组的实现思路,亦可用常数空间的滚动变量进一步优化。

NC76 用两个栈实现队列

本文介绍了利用两个栈实现队列的算法要求:在 O(n) 空间内完成 n 次入队(push)和 n 次出队(pop),且每次操作时间复杂度均为 O(1)。通过在 stack1 中正常入栈,出队时若 stack2 为空则将 stack1 中全部元素倒入 stack2,实现先进先出的顺序。文章提供了示例说明操作过程,并给出 Java 实现代码,展示了 push 方法向 stack1 添加元素,pop 方法在必要时转移元素后从 stack2 弹出,实现队列的基本功能。

NC33 合并两个排序的链表

本文介绍了合并两个递增链表的算法,要求时间复杂度 O(n)、空间复杂度 O(1)。给出题目描述、示例及边界情况(空链表),并提供 Java 实现。核心思路是使用两个指针遍历两链表,比较当前节点值,将较小者接到结果链表尾部,并更新相应指针;首次插入时初始化头尾指针,循环结束后将剩余非空链表直接链接到结果尾部。代码实现简洁,满足题目约束。