Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6ab8d50

Browse files
Merge branch 'master' into dev
2 parents e4ede15 + 838a4fc commit 6ab8d50

10 files changed

+320
-6
lines changed

‎problems/0019.删除链表的倒数第N个节点.md‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,5 +338,28 @@ object Solution {
338338
}
339339
}
340340
```
341+
342+
Rust:
343+
```rust
344+
impl Solution {
345+
pub fn remove_nth_from_end(head: Option<Box<ListNode>>, mut n: i32) -> Option<Box<ListNode>> {
346+
let mut dummy_head = Box::new(ListNode::new(0));
347+
dummy_head.next = head;
348+
let mut fast = &dummy_head.clone();
349+
let mut slow = &mut dummy_head;
350+
while n > 0 {
351+
fast = fast.next.as_ref().unwrap();
352+
n -= 1;
353+
}
354+
while fast.next.is_some() {
355+
fast = fast.next.as_ref().unwrap();
356+
slow = slow.next.as_mut().unwrap();
357+
}
358+
slow.next = slow.next.as_mut().unwrap().next.take();
359+
dummy_head.next
360+
}
361+
}
362+
```
363+
341364
-----------------------
342365
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/0024.两两交换链表中的节点.md‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,5 +380,51 @@ function swapPairs($head)
380380
}
381381
```
382382

383+
Rust:
384+
385+
```rust
386+
// 虚拟头节点
387+
impl Solution {
388+
pub fn swap_pairs(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
389+
let mut dummy_head = Box::new(ListNode::new(0));
390+
dummy_head.next = head;
391+
let mut cur = dummy_head.as_mut();
392+
while let Some(mut node) = cur.next.take() {
393+
if let Some(mut next) = node.next.take() {
394+
node.next = next.next.take();
395+
next.next = Some(node);
396+
cur.next = Some(next);
397+
cur = cur.next.as_mut().unwrap().next.as_mut().unwrap();
398+
} else {
399+
cur.next = Some(node);
400+
cur = cur.next.as_mut().unwrap();
401+
}
402+
}
403+
dummy_head.next
404+
}
405+
}
406+
```
407+
408+
```rust
409+
// 递归
410+
impl Solution {
411+
pub fn swap_pairs(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
412+
if head == None || head.as_ref().unwrap().next == None {
413+
return head;
414+
}
415+
416+
let mut node = head.unwrap();
417+
418+
if let Some(mut next) = node.next.take() {
419+
node.next = Solution::swap_pairs(next.next);
420+
next.next = Some(node);
421+
Some(next)
422+
} else {
423+
Some(node)
424+
}
425+
}
426+
}
427+
```
428+
383429
-----------------------
384430
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/0035.搜索插入位置.md‎

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,57 @@ function searchInsert($nums, $target)
429429
return $r + 1;
430430
}
431431
```
432-
432+
### C
433+
```c
434+
//版本一 [left, right]左闭右闭区间
435+
int searchInsert(int* nums, int numsSize, int target){
436+
//左闭右开区间 [0 , numsSize-1]
437+
int left =0;
438+
int mid =0;
439+
int right = numsSize - 1;
440+
while(left <= right){//左闭右闭区间 所以可以 left == right
441+
mid = left + (right - left) / 2;
442+
if(target < nums[mid]){
443+
//target 在左区间 [left, mid - 1]中,原区间包含mid,右区间边界可以向左内缩
444+
right = mid -1;
445+
}else if( target > nums[mid]){
446+
//target 在右区间 [mid + 1, right]中,原区间包含mid,左区间边界可以向右内缩
447+
left = mid + 1;
448+
}else {
449+
// nums[mid] == target ,顺利找到target,直接返回mid
450+
return mid;
451+
}
452+
}
453+
//数组中未找到target元素
454+
//target在数组所有元素之后,[left, right]是右闭区间,需要返回 right +1
455+
return right + 1;
456+
}
457+
```
458+
```c
459+
//版本二 [left, right]左闭右开区间
460+
int searchInsert(int* nums, int numsSize, int target){
461+
//左闭右开区间 [0 , numsSize)
462+
int left =0;
463+
int mid =0;
464+
int right = numsSize;
465+
while(left < right){//左闭右闭区间 所以 left < right
466+
mid = left + (right - left) / 2;
467+
if(target < nums[mid]){
468+
//target 在左区间 [left, mid)中,原区间没有包含mid,右区间边界不能内缩
469+
right = mid ;
470+
}else if( target > nums[mid]){
471+
// target 在右区间 [mid+1, right)中,原区间包含mid,左区间边界可以向右内缩
472+
left = mid + 1;
473+
}else {
474+
// nums[mid] == target ,顺利找到target,直接返回mid
475+
return mid;
476+
}
477+
}
478+
//数组中未找到target元素
479+
//target在数组所有元素之后,[left, right)是右开区间, return right即可
480+
return right;
481+
}
482+
```
433483

434484
-----------------------
435485
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/0072.编辑距离.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ function minDistance(word1: string, word2: string): number {
364364

365365
C:
366366

367+
367368
```c
368369
int min(int num1, int num2, int num3) {
369370
return num1 > num2 ? (num2 > num3 ? num3 : num2) : (num1 > num3 ? num3 : num1);

‎problems/0090.子集II.md‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,39 @@ function subsetsWithDup(nums: number[]): number[][] {
367367
};
368368
```
369369

370+
set去重版本:
371+
```typescript
372+
// 使用set去重版本
373+
function subsetsWithDup(nums: number[]): number[][] {
374+
const result: number[][] = [];
375+
const path: number[] = [];
376+
// 去重之前先排序
377+
nums.sort((a, b) => a - b);
378+
function backTracking(startIndex: number) {
379+
// 收集结果
380+
result.push([...path])
381+
// 此处不返回也可以因为,每次递归都会使startIndex + 1,当这个数大到nums.length的时候就不会进入递归了。
382+
if (startIndex === nums.length) {
383+
return
384+
}
385+
// 定义每一个树层的set集合
386+
const set: Set<number> = new Set()
387+
for (let i = startIndex; i < nums.length; i++) {
388+
// 去重
389+
if (set.has(nums[i])) {
390+
continue
391+
}
392+
set.add(nums[i])
393+
path.push(nums[i])
394+
backTracking(i + 1)
395+
// 回溯
396+
path.pop()
397+
}
398+
}
399+
backTracking(0)
400+
return result
401+
};
402+
```
370403
### Rust
371404

372405
```Rust

‎problems/0150.逆波兰表达式求值.md‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,29 @@ C++代码如下:
8989
class Solution {
9090
public:
9191
int evalRPN(vector<string>& tokens) {
92-
stack<int> st;
92+
// 力扣修改了后台测试数据,需要用longlong
93+
stack<long long> st;
9394
for (int i = 0; i < tokens.size(); i++) {
9495
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
95-
int num1 = st.top();
96+
long long num1 = st.top();
9697
st.pop();
97-
int num2 = st.top();
98+
long long num2 = st.top();
9899
st.pop();
99100
if (tokens[i] == "+") st.push(num2 + num1);
100101
if (tokens[i] == "-") st.push(num2 - num1);
101102
if (tokens[i] == "*") st.push((long)num2 * (long)num1); //力扣改了后台测试数据
102103
if (tokens[i] == "/") st.push(num2 / num1);
103104
} else {
104-
st.push(stoi(tokens[i]));
105+
st.push(stoll(tokens[i]));
105106
}
106107
}
108+
107109
int result = st.top();
108110
st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
109111
return result;
110112
}
111113
};
114+
112115
```
113116

114117
## 题外话

‎problems/0206.翻转链表.md‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,5 +588,45 @@ object Solution {
588588

589589
}
590590
```
591+
592+
Rust:
593+
双指针法:
594+
595+
```rust
596+
impl Solution {
597+
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
598+
let mut cur = head;
599+
let mut pre = None;
600+
while let Some(mut node) = cur.take() {
601+
cur = node.next;
602+
node.next = pre;
603+
pre = Some(node);
604+
}
605+
pre
606+
}
607+
}
608+
```
609+
610+
递归法:
611+
612+
```rust
613+
impl Solution {
614+
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
615+
fn rev(
616+
mut head: Option<Box<ListNode>>,
617+
mut pre: Option<Box<ListNode>>,
618+
) -> Option<Box<ListNode>> {
619+
if let Some(mut node) = head.take() {
620+
let cur = node.next;
621+
node.next = pre;
622+
pre = Some(node);
623+
return rev(cur, pre);
624+
}
625+
pre
626+
}
627+
rev(head, None)
628+
}
629+
}
630+
```
591631
-----------------------
592632
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/0455.分发饼干.md‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ function findContentChildren(g: number[], s: number[]): number {
274274
### C
275275

276276
```c
277+
///小餅乾先餵飽小胃口的
277278
int cmp(int* a, int* b) {
278279
return *a - *b;
279280
}
@@ -296,6 +297,33 @@ int findContentChildren(int* g, int gSize, int* s, int sSize){
296297
}
297298
```
298299
300+
```c
301+
///大餅乾先餵飽大胃口的
302+
int cmp(int* a, int* b) {
303+
return *a - *b;
304+
}
305+
306+
int findContentChildren(int* g, int gSize, int* s, int sSize){
307+
if(sSize == 0)
308+
return 0;
309+
310+
//将两个数组排序为升序
311+
qsort(g, gSize, sizeof(int), cmp);
312+
qsort(s, sSize, sizeof(int), cmp);
313+
314+
int count = 0;
315+
int start = sSize - 1;
316+
317+
for(int i = gSize - 1; i >= 0; i--) {
318+
if(start >= 0 && s[start] >= g[i] ) {
319+
start--;
320+
count++;
321+
}
322+
}
323+
return count;
324+
}
325+
```
326+
299327
### Scala
300328

301329
```scala

‎problems/0583.两个字符串的删除操作.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word
4747

4848
那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
4949

50+
因为dp[i - 1][j - 1] + 1等于 dp[i - 1][j] 或 dp[i][j - 1],所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
51+
5052

5153
3. dp数组如何初始化
5254

@@ -90,7 +92,7 @@ public:
9092
if (word1[i - 1] == word2[j - 1]) {
9193
dp[i][j] = dp[i - 1][j - 1];
9294
} else {
93-
dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
95+
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
9496
}
9597
}
9698
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /