Skip to content

Commit 0dbdf11

Browse files
committed
docs: add No3、27、35题解
1 parent a22375b commit 0dbdf11

File tree

4 files changed

+185
-0
lines changed

4 files changed

+185
-0
lines changed

leetcode刷题/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# LootCode 刷题
22

33
- [No.1 两数之和](note/No1_two-sum.md)
4+
- [No.3 无重复字符的最长子串](note/No3_length-of-longest-substring.md)
45
- [No.7 整数反转](note/No7_reverse.md)
56
- [No.8 字符串转换整数 (atoi)](note/No8_my-atoi.md)
67
- [No.13 罗马数字转整数](note/No13_roman-to-int.md)
@@ -9,6 +10,8 @@
910
- [No.20 有效的括号](note/No20_is-valid.md)
1011
- [No.21 合并两个有序链表](note/No21_merge-two-lists.md)
1112
- [No.26 从排序数组中删除重复项](note/No26_remove-duplicates.md)
13+
- [No.27 移除元素](note/No27-removeElement.md)
14+
- [No.35 搜索插入位置](note/No35_search-insert.md)
1215
- [No.36 有效的数独](note/No36_isvalid-sudoku.md)
1316
- [No.38 报数](note/No38_count-and-say.md)
1417
- [No.48 旋转图像](note/No48_rotate.md)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# No.27 移除元素
2+
3+
难度:`easy`
4+
5+
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
6+
7+
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
8+
9+
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
10+
11+
## 示例
12+
13+
示例 1:
14+
```
15+
给定 nums = [3,2,2,3], val = 3,
16+
17+
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
18+
19+
你不需要考虑数组中超出新长度后面的元素。
20+
```
21+
22+
示例 2:
23+
```
24+
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
25+
26+
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
27+
28+
注意这五个元素可为任意顺序。
29+
30+
你不需要考虑数组中超出新长度后面的元素。
31+
```
32+
33+
## 解题思路
34+
35+
循环数组,如果值相等,则与数组末尾的数进行交换,同时长度减1。
36+
37+
38+
代码如下:
39+
40+
```javascript
41+
/**
42+
* @param {number[]} nums
43+
* @param {number} val
44+
* @return {number}
45+
*/
46+
var removeElement = function(nums, val) {
47+
let ans = nums.length;
48+
for (let i = 0; i < ans;) {
49+
if (nums[i] == val) {
50+
nums[i] = nums[ans - 1];
51+
ans--;
52+
} else {
53+
i++;
54+
}
55+
}
56+
return ans;
57+
};
58+
```
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# No.35 搜索插入位置
2+
3+
难度:`easy`
4+
5+
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
6+
7+
你可以假设数组中无重复元素。
8+
9+
## 示例
10+
11+
示例 1:
12+
13+
```
14+
输入: [1,3,5,6], 5
15+
输出: 2
16+
```
17+
示例 2:
18+
```
19+
输入: [1,3,5,6], 2
20+
输出: 1
21+
```
22+
示例 3:
23+
```
24+
输入: [1,3,5,6], 7
25+
输出: 4
26+
```
27+
示例 4:
28+
```
29+
输入: [1,3,5,6], 0
30+
输出: 0
31+
```
32+
33+
## 解题思路
34+
35+
简单的二分法。
36+
37+
代码如下:
38+
39+
```javascript
40+
/**
41+
* @param {number[]} nums
42+
* @param {number} target
43+
* @return {number}
44+
*/
45+
var searchInsert = function(nums, target) {
46+
let index = 0;
47+
let n = nums.length
48+
49+
let left = 0, right = n-1;
50+
// 二分法
51+
while(left <= right) {
52+
let mid = Math.floor((left + right)/2);
53+
if (nums[mid] == target) {
54+
return mid;
55+
} else if (nums[mid] < target) {
56+
// 题目要我们返回大于或者等于目标值的第 1 个数的索引
57+
// 此时 mid 一定不是所求的左边界,
58+
// 此时左边界更新为 mid + 1
59+
left = mid + 1;
60+
} else {
61+
// 既然不会等于,此时 nums[mid] > target
62+
// mid 也一定不是所求的右边界
63+
// 此时右边界更新为 mid - 1
64+
right = mid - 1;
65+
}
66+
}
67+
return left;
68+
};
69+
```
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# No.3 无重复字符的最长子串
2+
3+
难度:`middle`
4+
5+
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
6+
7+
## 示例
8+
9+
示例 1:
10+
```
11+
输入: "abcabcbb"
12+
输出: 3
13+
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
14+
```
15+
示例 2:
16+
```
17+
输入: "bbbbb"
18+
输出: 1
19+
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
20+
```
21+
示例 3:
22+
```
23+
输入: "pwwkew"
24+
输出: 3
25+
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
26+
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
27+
```
28+
29+
## 解题思路
30+
31+
一遍循环,使用滑动窗口的思想,找出最大值即可。
32+
33+
代码如下:
34+
35+
36+
```javascript
37+
/**
38+
* @param {string} s
39+
* @return {number}
40+
*/
41+
var lengthOfLongestSubstring = function(s) {
42+
43+
let n = s.length, ans = 0, start = 0;
44+
let map = new Map();
45+
for (let i = 0; i < n; i++) {
46+
let char = s[i];
47+
if (map.has(char)) {
48+
start = Math.max(map.get(char), start)
49+
}
50+
ans = Math.max(ans, i - start + 1);
51+
map.set(s[i], i + 1);
52+
}
53+
return ans;
54+
};
55+
```

0 commit comments

Comments
 (0)