加载中

NowCoder

文章分类

浏览该分类下的所有文章

60 篇文章 5

922. 按奇偶排序数组 II

该题要求将长度为偶数且奇、偶数各占一半的数组重新排列,使得奇数位于奇数索引、偶数位于偶数索引。思路是分别收集数组中的所有偶数和奇数,分别存入两个长度为 n/2 的临时数组,然后交替写回原数组:先放一个偶数,再放一个奇数,依次完成整个数组的重构。代码实现中使用两次遍历完成分离和合并,时间复杂度 O(n),额外空间 O(n)。

13. 罗马数字转整数

本文介绍了 LeetCode 第13题“罗马数字转整数”。先给出罗马字符及其数值,并说明仅在 I、X、C 前置于特定更大字符时构成减法(如 IV、IX、XL、XC、CD、CM)。题目要求把合法的罗马数字(长度 ≤15,数值 1~3999)转换为整数。提供的解法遍历字符串,记录前一个字符的数值;若前值小于当前值则减去前值,否则加上前值,遍历结束后再加上最后一个数值。该算法时间 O(n)、空间 O(1)。代码实现采用 switch 映射字符到数值。

1507. 转变日期格式

本文介绍了 LeetCode 1507 题目 “转变日期格式”。给定形如 “Day Month Year” 的字符串,其中 Day 带有序数后缀(如 1st、2nd),Month 为英文缩写,Year 在 1900~2100。要求将其转换为标准的 “YYYY‑MM‑DD” 形式。文章提供了实现思路:先用空格分割得到年、月、日;通过预定义的月份数组将英文月份映射为两位数字;去除日中的后缀并在必要时前置零;最后按 “年‑月‑日” 组合返回。代码采用 StringBuilder 构造结果,兼顾月份和日期的零填充,且不需额外异常处理。

20.有效的括号

本文介绍了判断仅含括号字符 “()[]{}” 的字符串是否有效的算法。有效性要求左括号必须被相同类型的右括号闭合且顺序正确。给出五个示例说明 true/false 情形,并列出约束条件(长度 1~10⁴,字符集限定)。核心解法使用栈:遍历字符串,遇左括号压入对应右括号,遇右括号时检查栈顶是否匹配并弹出,若不匹配或栈空则返回 false。遍历结束后栈为空即为有效。代码实现简洁明了,时间复杂度 O(n),空间复杂度 O(n)。

1108. IP 地址无效化

本文介绍了 LeetCode 第 1108 题 “IP 地址无效化”。给定一个合法的 IPv4 地址,需要将其中的每个点号 “.” 替换为 “[.]”,返回处理后的字符串。文中提供了两个示例,分别将 “1.1.1.1” 与 “255.100.50.0” 转换为 “1[.]1[.]1[.]1” 与 “255[.]100[.]50[.]0”。随后给出 Java 实现:遍历字符串,遇到 ‘.’ 时追加 “[.]”,否则直接追加原字符,最终返回构建好的结果。整个解法时间复杂度 O(n),空间复杂度 O(n)。

338. 比特位计数

本文介绍了 LeetCode 第 338 题“比特位计数”。给定整数 n,需要计算区间 [0, n] 内每个数的二进制表示中 1 的个数,并返回长度为 n+1 的数组。示例说明了输入输出对应关系。文中给出一种 O(n) 时间、O(1) 额外空间的动态规划实现:若 i 为偶数,则 ans[i] = ans[i/2](最高位为 0),否则 ans[i] = ans[i‑1] + 1(在前一个数基础上增加一个 1)。代码基于该思路完成求解。

739. 每日温度

本文介绍了 LeetCode 第 739 题 “每日温度”。题目要求对给定的气温数组,计算每一天需要等待多少天才能出现更高温度,若之后没有更高温度则返回 0。文中给出三个示例说明输入输出关系,并提供了基于单调递减栈的 Java 解法:遍历温度数组,利用栈记录尚未找到更高温度的下标,当遇到更高温度时弹出栈中下标并计算间隔天数,最终得到结果数组。

75. 颜色分类

本题要求对仅包含 0、1、2(分别代表红、白、蓝)的长度为 n 的数组就地排序,使相同颜色相邻且顺序为红、白、蓝。核心思路是经典的荷兰国旗算法:利用左指针 left、右指针 right 和遍历指针 i,将 0 移到左侧、2 移到右侧,遇到 1 时直接前进。代码实现中通过条件判断在 O(n) 时间、O(1) 额外空间内完成交换,实现了高效的原地排序。

5. 最长回文子串

本文介绍了“最长回文子串”问题的实现。给定字符串 s,要求找出其中最长的回文子串,示例包括 `"babad"` → `"bab"`(或 `"aba"`)、`"cbbd"` → `"bb"` 等。代码采用中心扩展法:遍历所有可能的中心位置(包括奇偶长度),从中心向两侧展开比较字符,若相等则更新当前回文子串;在遍历过程中记录最长的回文子串并返回。该实现时间复杂度为 O(n²),空间复杂度为 O(1)。

647. 回文子串

本文介绍了 LeetCode 647 “回文子串”问题:统计字符串中所有回文子串的数量,子串位置不同即视为不同。通过中心扩展法遍历 2·n‑1 个可能的中心,分别向左右扩展,只要左右字符相等即计数并继续扩展,最终返回计数结果。代码实现简洁,时间复杂度 O(n²),空间复杂度 O(1)。

322. 零钱兑换

本文介绍 LeetCode 322 “零钱兑换”问题:给定硬币面额数组和目标金额,求凑成该金额的最少硬币数,若不可达返回‑1。实现采用自底向上的动态规划,创建长度为 amount+1 的数组 target,初始化为 amount+1(视作不可达),target[0]=0。遍历每个金额 i,尝试所有硬币 coin,若 i‑coin≥0,则更新 target[i]=min(target[i], target[i‑coin]+1)。最终若 target[amount]仍为初始值则返回‑1,否则返回该最小值。代码示例展示了完整实现及测试用例。

1324.竖直打印单词

本文实现了 LeetCode 1324 “竖直打印单词”。给定一个由空格分隔的句子,要求按单词出现顺序将字符竖向排列,每列对应一个单词,必要时用空格填充且去除行尾多余空格。代码思路:先用 `split` 将句子拆成单词数组,遍历求出最长单词长度 `maxLength`;随后对每一行 i(0 到 maxLength‑1)遍历所有单词,若单词长度大于 i 则取其第 i 个字符,否则补空格,构建行字符串。最后从行尾向前查找首个非空格字符,截取子串去除尾随空格并加入结果列表。整体实现简洁,时间复杂度 O(n·m),其中 n 为单词数,m 为最长单词长度。