Skip to content

Commit 856a024

Browse files
committed
docs: update lcof problems
1 parent b9c02ea commit 856a024

File tree

61 files changed

+2351
-2038
lines changed
  • lcof
    • 面试题16. 数值的整数次方
    • 面试题17. 打印从1到最大的n位数
    • 面试题19. 正则表达式匹配
    • 面试题20. 表示数值的字符串
    • 面试题21. 调整数组顺序使奇数位于偶数前面
    • 面试题22. 链表中倒数第k个节点
    • 面试题24. 反转链表
    • 面试题25. 合并两个排序的链表
    • 面试题26. 树的子结构
    • 面试题27. 二叉树的镜像
    • 面试题28. 对称的二叉树
    • 面试题29. 顺时针打印矩阵
    • 面试题30. 包含min函数的栈
    • 面试题31. 栈的压入、弹出序列
    • 面试题32 - I. 从上到下打印二叉树
    • 面试题32 - II. 从上到下打印二叉树 II
    • 面试题32 - III. 从上到下打印二叉树 III
    • 面试题33. 二叉搜索树的后序遍历序列
    • 面试题34. 二叉树中和为某一值的路径
    • 面试题35. 复杂链表的复制
    • 面试题36. 二叉搜索树与双向链表
    • 面试题37. 序列化二叉树
    • 面试题38. 字符串的排列
    • 面试题39. 数组中出现次数超过一半的数字
    • 面试题40. 最小的k个数
    • 面试题41. 数据流中的中位数
    • 面试题42. 连续子数组的最大和
    • 面试题43. 1~n整数中1出现的次数
    • 面试题44. 数字序列中某一位的数字
    • 面试题45. 把数组排成最小的数
    • 面试题46. 把数字翻译成字符串
    • 面试题47. 礼物的最大价值
    • 面试题48. 最长不含重复字符的子字符串
    • 面试题49. 丑数
    • 面试题50. 第一个只出现一次的字符
    • 面试题51. 数组中的逆序对
    • 面试题52. 两个链表的第一个公共节点
    • 面试题53 - I. 在排序数组中查找数字 I
    • 面试题53 - II. 0~n-1中缺失的数字
    • 面试题54. 二叉搜索树的第k大节点
    • 面试题55 - I. 二叉树的深度
    • 面试题55 - II. 平衡二叉树
    • 面试题56 - I. 数组中数字出现的次数
    • 面试题56 - II. 数组中数字出现的次数 II
    • 面试题57 - II. 和为s的连续正数序列
    • 面试题57. 和为s的两个数字
    • 面试题58 - I. 翻转单词顺序
    • 面试题58 - II. 左旋转字符串
    • 面试题59 - I. 滑动窗口的最大值
    • 面试题59 - II. 队列的最大值
    • 面试题60. n个骰子的点数
    • 面试题61. 扑克牌中的顺子
    • 面试题62. 圆圈中最后剩下的数字
    • 面试题63. 股票的最大利润
    • 面试题64. 求1+2+…+n
    • 面试题65. 不用加减乘除做加法
    • 面试题66. 构建乘积数组
    • 面试题67. 把字符串转换成整数
    • 面试题68 - I. 二叉搜索树的最近公共祖先
    • 面试题68 - II. 二叉树的最近公共祖先

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+2351
-2038
lines changed

lcof/面试题16. 数值的整数次方/README.md

+43-34
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,43 @@
22

33
## 题目描述
44

5-
实现函数 double Power(double base, int exponent),求 baseexponent 次方。不得使用库函数,同时不需要考虑大数问题。
5+
<p>实现 <a href="https://www.cplusplus.com/reference/valarray/pow/">pow(<em>x</em>, <em>n</em>)</a> ,即计算 xn 次幂函数(即,x<sup>n</sup>)。不得使用库函数,同时不需要考虑大数问题。</p>
66

7-
**示例 1:**
7+
<p> </p>
88

9-
```
10-
输入: 2.00000, 10
11-
输出: 1024.00000
12-
```
9+
<p><strong>示例 1:</strong></p>
1310

14-
**示例  2:**
11+
<pre>
12+
<strong>输入:</strong>x = 2.00000, n = 10
13+
<strong>输出:</strong>1024.00000
14+
</pre>
1515

16-
```
17-
输入: 2.10000, 3
18-
输出: 9.26100
19-
```
16+
<p><strong>示例 2:</strong></p>
2017

21-
**示例  3:**
18+
<pre>
19+
<strong>输入:</strong>x = 2.10000, n = 3
20+
<strong>输出:</strong>9.26100</pre>
2221

23-
```
24-
输入: 2.00000, -2
25-
输出: 0.25000
26-
解释: 2-2 = 1/22 = 1/4 = 0.25
27-
```
22+
<p><strong>示例 3:</strong></p>
2823

29-
**说明:**
24+
<pre>
25+
<strong>输入:</strong>x = 2.00000, n = -2
26+
<strong>输出:</strong>0.25000
27+
<strong>解释:</strong>2<sup>-2</sup> = 1/2<sup>2</sup> = 1/4 = 0.25</pre>
3028

31-
- `-100.0 < x < 100.0`
32-
- n  是 32 位有符号整数,其数值范围是   `[−231, 231 − 1]`
29+
<p> </p>
30+
31+
<p><strong>提示:</strong></p>
32+
33+
<ul>
34+
<li><code>-100.0 < x < 100.0</code></li>
35+
<li><code>-2<sup>31</sup> <= n <= 2<sup>31</sup>-1</code></li>
36+
<li><code>-10<sup>4</sup> <= x<sup>n</sup> <= 10<sup>4</sup></code></li>
37+
</ul>
38+
39+
<p> </p>
40+
41+
<p>注意:本题与主站 50 题相同:<a href="https://leetcode-cn.com/problems/powx-n/">https://leetcode-cn.com/problems/powx-n/</a></p>
3342

3443
## 解法
3544

@@ -73,21 +82,21 @@ class Solution {
7382
* @return {number}
7483
*/
7584
var myPow = function (x, n) {
76-
let r = 1;
77-
let tmp = x;
78-
let tag = 0;
79-
if (n < 0) {
80-
tag = 1;
81-
n = -n;
82-
}
83-
while (n) {
84-
if (n & 1) {
85-
r *= tmp;
86-
}
87-
tmp *= tmp;
88-
n >>>= 1;
85+
let r = 1;
86+
let tmp = x;
87+
let tag = 0;
88+
if (n < 0) {
89+
tag = 1;
90+
n = -n;
91+
}
92+
while (n) {
93+
if (n & 1) {
94+
r *= tmp;
8995
}
90-
return tag ? 1 / r : r;
96+
tmp *= tmp;
97+
n >>>= 1;
98+
}
99+
return tag ? 1 / r : r;
91100
};
92101
```
93102

lcof/面试题17. 打印从1到最大的n位数/README.md

+17-14
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22

33
## 题目描述
44

5-
输入数字 `n`,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
5+
<p>输入数字 <code>n</code>,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。</p>
66

7-
**示例 1:**
7+
<p><strong>示例 1:</strong></p>
88

9-
```
10-
输入: n = 1
11-
输出: [1,2,3,4,5,6,7,8,9]
12-
```
9+
<pre><strong>输入:</strong> n = 1
10+
<strong>输出:</strong> [1,2,3,4,5,6,7,8,9]
11+
</pre>
1312

14-
**说明:**
13+
<p>&nbsp;</p>
1514

16-
- 用返回一个整数列表来代替打印
17-
- n 为正整数
15+
<p>说明:</p>
16+
17+
<ul>
18+
<li>用返回一个整数列表来代替打印</li>
19+
<li>n 为正整数</li>
20+
</ul>
1821

1922
## 解法
2023

@@ -51,11 +54,11 @@ class Solution {
5154
* @return {number[]}
5255
*/
5356
var printNumbers = function (n) {
54-
let res = [];
55-
for (let i = 1; i < 10 ** n; ++i) {
56-
res.push(i);
57-
}
58-
return res;
57+
let res = [];
58+
for (let i = 1; i < 10 ** n; ++i) {
59+
res.push(i);
60+
}
61+
return res;
5962
};
6063
```
6164

lcof/面试题19. 正则表达式匹配/README.md

+57-59
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,57 @@
22

33
## 题目描述
44

5-
请实现一个函数用来匹配包含`'. '``'*'`的正则表达式。模式中的字符`'.'`表示任意一个字符,而`'*'`表示它前面的字符可以出现任意次(含 0 次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串`"aaa"`与模式`"a.a"``"ab*ac*a"`匹配,但与`"aa.a"``"ab*a"`均不匹配。
5+
<p>请实现一个函数用来匹配包含<code>&#39;. &#39;</code>和<code>&#39;*&#39;</code>的正则表达式。模式中的字符<code>&#39;.&#39;</code>表示任意一个字符,而<code>&#39;*&#39;</code>表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串<code>&quot;aaa&quot;</code>与模式<code>&quot;a.a&quot;</code>和<code>&quot;ab*ac*a&quot;</code>匹配,但与<code>&quot;aa.a&quot;</code>和<code>&quot;ab*a&quot;</code>均不匹配。</p>
66

7-
**示例 1:**
7+
<p><strong>示例 1:</strong></p>
88

9-
```
10-
输入:
11-
s = "aa"
12-
p = "a"
13-
输出: false
14-
解释: "a" 无法匹配 "aa" 整个字符串。
15-
```
9+
<pre><strong>输入:</strong>
10+
s = &quot;aa&quot;
11+
p = &quot;a&quot;
12+
<strong>输出:</strong> false
13+
<strong>解释:</strong> &quot;a&quot; 无法匹配 &quot;aa&quot; 整个字符串。
14+
</pre>
1615

17-
**示例 2:**
16+
<p><strong>示例 2:</strong></p>
1817

19-
```
20-
输入:
21-
s = "aa"
22-
p = "a*"
23-
输出: true
24-
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
25-
```
18+
<pre><strong>输入:</strong>
19+
s = &quot;aa&quot;
20+
p = &quot;a*&quot;
21+
<strong>输出:</strong> true
22+
<strong>解释:</strong>&nbsp;因为 &#39;*&#39; 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 &#39;a&#39;。因此,字符串 &quot;aa&quot; 可被视为 &#39;a&#39; 重复了一次。
23+
</pre>
2624

27-
**示例  3:**
25+
<p><strong>示例&nbsp;3:</strong></p>
2826

29-
```
30-
输入:
31-
s = "ab"
32-
p = ".*"
33-
输出: true
34-
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
35-
```
27+
<pre><strong>输入:</strong>
28+
s = &quot;ab&quot;
29+
p = &quot;.*&quot;
30+
<strong>输出:</strong> true
31+
<strong>解释:</strong>&nbsp;&quot;.*&quot; 表示可匹配零个或多个(&#39;*&#39;)任意字符(&#39;.&#39;)。
32+
</pre>
3633

37-
**示例 4:**
34+
<p><strong>示例 4:</strong></p>
3835

39-
```
40-
输入:
41-
s = "aab"
42-
p = "c*a*b"
43-
输出: true
44-
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
45-
```
36+
<pre><strong>输入:</strong>
37+
s = &quot;aab&quot;
38+
p = &quot;c*a*b&quot;
39+
<strong>输出:</strong> true
40+
<strong>解释:</strong>&nbsp;因为 &#39;*&#39; 表示零个或多个,这里 &#39;c&#39; 为 0 个, &#39;a&#39; 被重复一次。因此可以匹配字符串 &quot;aab&quot;
41+
</pre>
4642

47-
**示例 5:**
43+
<p><strong>示例 5:</strong></p>
4844

49-
```
50-
输入:
51-
s = "mississippi"
52-
p = "mis*is*p*."
53-
输出: false
54-
```
45+
<pre><strong>输入:</strong>
46+
s = &quot;mississippi&quot;
47+
p = &quot;mis*is*p*.&quot;
48+
<strong>输出:</strong> false</pre>
49+
50+
<ul>
51+
<li><code>s</code>&nbsp;可能为空,且只包含从&nbsp;<code>a-z</code>&nbsp;的小写字母。</li>
52+
<li><code>p</code>&nbsp;可能为空,且只包含从&nbsp;<code>a-z</code>&nbsp;的小写字母以及字符&nbsp;<code>.</code>&nbsp;和&nbsp;<code>*</code>,无连续的 <code>&#39;*&#39;</code>。</li>
53+
</ul>
5554

56-
- `s`  可能为空,且只包含从  `a-z`  的小写字母。
57-
- `p`  可能为空,且只包含从  `a-z`  的小写字母,以及字符  `.`  和  `*`
55+
<p>注意:本题与主站 10&nbsp;题相同:<a href="https://leetcode-cn.com/problems/regular-expression-matching/">https://leetcode-cn.com/problems/regular-expression-matching/</a></p>
5856

5957
## 解法
6058

@@ -64,8 +62,8 @@ p = "mis*is*p*."
6462

6563
1. `s[i] == p[j]` or `p[j] == '.'`:比如 ab**b** 和 ab**b**,或者 ab**b** 和 ab. ,很容易得到 `dp[i][j]` = `dp[i-1][j-1]` = True。因为 ab 和 ab 是匹配的,如果后面分别加一个 b,或者 s 加一个 b 而 p 加一个 `.` ,仍然是匹配的。
6664
2. `p[j] == '*'`:当 `p[j] == '*'` 时,由于 `*` 与前面的字符相关,因此我们比较 `*` 前面的字符 `p[j-1]``s[i]` 的关系。根据 `*` 前面的字符与 s[i] 是否相等,又可分为以下两种情况:
67-
- `p[j-1] != s[i]`:如果 `*` 前一个字符匹配不上,`*` 匹配了 0 次,应忽略这两个字符,看 `p[j-2]``s[i]` 是否匹配。 这时 `dp[i][j] = dp[i][j-2]`
68-
- `p[j-1] == s[i]` or `p[j-1] == '.'``*` 前面的字符可以与 s[i] 匹配,这种情况下,`*` 可能匹配了前面的字符的 0 个,也可能匹配了前面字符的多个,当匹配 0 个时,如 `ab``abb*`,或者 `ab``ab.*` ,这时我们需要去掉 p 中的 `b*``.*` 后进行比较,即 `dp[i][j] = dp[i][j-2]`;当匹配多个时,如 `abbb``ab*`,或者 `abbb``a.*`,我们需要将 s[i] 前面的与 p 重新比较,即 `dp[i][j] = dp[i-1][j]`
65+
- `p[j-1] != s[i]`:如果 `*` 前一个字符匹配不上,`*` 匹配了 0 次,应忽略这两个字符,看 `p[j-2]``s[i]` 是否匹配。 这时 `dp[i][j] = dp[i][j-2]`
66+
- `p[j-1] == s[i]` or `p[j-1] == '.'``*` 前面的字符可以与 s[i] 匹配,这种情况下,`*` 可能匹配了前面的字符的 0 个,也可能匹配了前面字符的多个,当匹配 0 个时,如 `ab``abb*`,或者 `ab``ab.*` ,这时我们需要去掉 p 中的 `b*``.*` 后进行比较,即 `dp[i][j] = dp[i][j-2]`;当匹配多个时,如 `abbb``ab*`,或者 `abbb``a.*`,我们需要将 s[i] 前面的与 p 重新比较,即 `dp[i][j] = dp[i-1][j]`
6967
3. 其他情况:以上两种情况把能匹配的都考虑全面了,所以其他情况为不匹配,即 `dp[i][j] = False`
7068

7169
<!-- tabs:start -->
@@ -206,22 +204,22 @@ func isMatch(s string, p string) bool {
206204
* @return {boolean}
207205
*/
208206
var isMatch = function (s, p) {
209-
// 回溯大法好
210-
let memo = {};
211-
function recursive(i, j) {
212-
if (memo[[i, j]] !== undefined) return memo[[i, j]];
213-
if (j === p.length) return i === s.length;
214-
let tmp = i < s.length && (s[i] === p[j] || p[j] === ".");
215-
let ans = false;
216-
if (p[j + 1] === "*") {
217-
ans = recursive(i, j + 2) || (tmp && recursive(i + 1, j));
218-
} else {
219-
ans = tmp && recursive(i + 1, j + 1);
220-
}
221-
memo[[i, j]] = ans;
222-
return ans;
207+
// 回溯大法好
208+
let memo = {};
209+
function recursive(i, j) {
210+
if (memo[[i, j]] !== undefined) return memo[[i, j]];
211+
if (j === p.length) return i === s.length;
212+
let tmp = i < s.length && (s[i] === p[j] || p[j] === ".");
213+
let ans = false;
214+
if (p[j + 1] === "*") {
215+
ans = recursive(i, j + 2) || (tmp && recursive(i + 1, j));
216+
} else {
217+
ans = tmp && recursive(i + 1, j + 1);
223218
}
224-
return recursive(0, 0);
219+
memo[[i, j]] = ans;
220+
return ans;
221+
}
222+
return recursive(0, 0);
225223
};
226224
```
227225

lcof/面试题20. 表示数值的字符串/README.md

+80-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,86 @@
44

55
<!-- 这里写题目描述 -->
66

7-
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
7+
<p>请实现一个函数用来判断字符串是否表示<strong>数值</strong>(包括整数和小数)。</p>
88

9-
注意:本题与主站 65 题相同:https://leetcode-cn.com/problems/valid-number/
9+
<p><strong>数值</strong>(按顺序)可以分成以下几个部分:</p>
10+
11+
<ol>
12+
<li>若干空格</li>
13+
<li>一个 <strong>小数</strong> 或者 <strong>整数</strong></li>
14+
<li>(可选)一个 <code>'e'</code> 或 <code>'E'</code> ,后面跟着一个 <strong>整数</strong></li>
15+
<li>若干空格</li>
16+
</ol>
17+
18+
<p><strong>小数</strong>(按顺序)可以分成以下几个部分:</p>
19+
20+
<ol>
21+
<li>(可选)一个符号字符(<code>'+'</code> 或 <code>'-'</code>)</li>
22+
<li>下述格式之一:
23+
<ol>
24+
<li>至少一位数字,后面跟着一个点 <code>'.'</code></li>
25+
<li>至少一位数字,后面跟着一个点 <code>'.'</code> ,后面再跟着至少一位数字</li>
26+
<li>一个点 <code>'.'</code> ,后面跟着至少一位数字</li>
27+
</ol>
28+
</li>
29+
</ol>
30+
31+
<p><strong>整数</strong>(按顺序)可以分成以下几个部分:</p>
32+
33+
<ol>
34+
<li>(可选)一个符号字符(<code>'+'</code> 或 <code>'-'</code>)</li>
35+
<li>至少一位数字</li>
36+
</ol>
37+
38+
<p>部分<strong>数值</strong>列举如下:</p>
39+
40+
<ul>
41+
<li><code>["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]</code></li>
42+
</ul>
43+
44+
<p>部分<strong>非数值</strong>列举如下:</p>
45+
46+
<ul>
47+
<li><code>["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]</code></li>
48+
</ul>
49+
50+
<p> </p>
51+
52+
<p><strong>示例 1:</strong></p>
53+
54+
<pre>
55+
<strong>输入:</strong>s = "0"
56+
<strong>输出:</strong>true
57+
</pre>
58+
59+
<p><strong>示例 2:</strong></p>
60+
61+
<pre>
62+
<strong>输入:</strong>s = "e"
63+
<strong>输出:</strong>false
64+
</pre>
65+
66+
<p><strong>示例 3:</strong></p>
67+
68+
<pre>
69+
<strong>输入:</strong>s = "."
70+
<strong>输出:</strong>false</pre>
71+
72+
<p><strong>示例 4:</strong></p>
73+
74+
<pre>
75+
<strong>输入:</strong>s = "    .1  "
76+
<strong>输出:</strong>true
77+
</pre>
78+
79+
<p> </p>
80+
81+
<p><strong>提示:</strong></p>
82+
83+
<ul>
84+
<li><code>1 <= s.length <= 20</code></li>
85+
<li><code>s</code> 仅含英文字母(大写和小写),数字(<code>0-9</code>),加号 <code>'+'</code> ,减号 <code>'-'</code> ,空格 <code>' '</code> 或者点 <code>'.'</code> 。</li>
86+
</ul>
1087

1188
## 解法
1289

@@ -100,7 +177,7 @@ class Solution {
100177
* @return {boolean}
101178
*/
102179
var isNumber = function (s) {
103-
return s !== " " && !isNaN(+s);
180+
return s !== " " && !isNaN(+s);
104181
};
105182
```
106183

0 commit comments

Comments
 (0)