给定一个字符串,判断它是否是一个有效的数字。有效数字由可选的符号、一个数字部分(整数,或者带小数点的小数,小数点前后至少有一侧有数字)、和可选的指数部分(`e` 或 `E`,后面跟可选的符号和至少一位整数)组成,中间不能有空格。规则不多,但细节很杂:`"4."` 和 `".5"`
给定一个用数字数组表示的非负整数(最高位在最前面,没有前导 0,`[1, 2, 3]` 表示 123),返回加 1 之后的数字数组。做法很直接:从最低位开始,遇到不是 9 的位就加 1 并结束,遇到 9 就变成 0 并继续向前进位;如果所有位都是 9,就在最前面补一个 1。这道题
给定两个用字符串表示的二进制数,返回它们的和(同样是二进制字符串)。做法就是竖式加法:从两个字符串的最低位(最右边)往左,逐位相加,每一位的结果是 `(a位 + b位 + 进位) % 2`,新的进位是 `(a位 + b位 + 进位) / 2`;两个数都走完之后如果还有进位,还要再
给定一组单词和一个行宽,把单词排成若干行,每行恰好 `maxWidth` 个字符,要求:每行尽量多放单词(贪心);单词之间至少一个空格;中间的行两端对齐,多余的空格尽量平均地分到单词之间的空隙里,如果分不均匀,左边的空隙多一个;最后一行左对齐,单词之间只有一个空格,右边补空格;只
给定一个非负整数 x,计算并返回 x 的算术平方根向下取整的结果,不允许使用内置的指数或平方根函数。因为只要整数部分,可以用二分查找:找最大的整数 r,使得 r × r ≤ x。这道题最有价值的一点是整数溢出:直接写 `mid * mid <= x`,在 32 位整数里当 mid
爬 n 阶楼梯到楼顶,每次可以爬 1 或 2 阶,问有多少种不同的方法。到第 n 阶的最后一步,要么是从第 n - 1 阶爬 1 阶,要么是从第 n - 2 阶爬 2 阶,所以方法数 f(n) = f(n-1) + f(n-2),这就是斐波那契数列(f(0) = f(1) = 1
给定一个 Unix 风格的绝对路径,把它简化成规范路径:`.` 表示当前目录,忽略;`..` 表示上一级目录;连续的多个 `/` 视为一个;结果以 `/` 开头,目录之间用单个 `/` 连接,末尾不带 `/`(根目录本身除外)。三个点 `...` 或者 `..a` 这样的名字是合
给定两个字符串 `word1` 和 `word2`,求把 `word1` 变成 `word2` 所需的最少操作数,操作只有三种:插入一个字符、删除一个字符、替换一个字符。这是经典的二维动态规划:`dp[i][j]` 表示 `word1` 的前 i 个字符变成 `word2` 的前
给定一个 m × n 的矩阵,如果某个元素是 0,就把它所在的整行和整列都设为 0,要求原地操作。最容易想到的做法是用两个集合记下所有含 0 的行和列,最后统一清零,额外空间 O(m + n)。进阶要求是只用 O(1) 额外空间:把矩阵自己的第一行和第一列当作"这一行要清零""这
给定一个 m × n 的矩阵,每一行从左到右升序,并且每一行的第一个数大于上一行的最后一个数。判断目标值是否在矩阵中。这个特殊的排列意味着:把所有行首尾相接,得到的是一个长度 m × n 的升序一维数组。所以可以直接对这个"虚拟"数组做二分查找,一维下标 k 对应第 `k / n
给定一个只含 0、1、2 的数组(分别代表红、白、蓝),原地排序,让相同的颜色相邻并按 0、1、2 的顺序排列,不允许使用库里的排序函数。最直接的想法是计数排序:扫描一遍数出 0、1、2 各有几个,再扫描一遍写回去。荷兰国旗算法只需要一遍扫描:用三个指针把数组分成四段,`[0,
给定字符串 s 和 t,在 s 里找出最短的连续子串,使它包含 t 中所有的字符(包括重复的:t 里有两个 `a`,子串里就至少要有两个 `a`),找不到返回空串。暴力做法是枚举所有子串再检查,代价很高。标准做法是滑动窗口:右边界向右扩张,直到窗口覆盖了 t;然后尽可能地收缩左边