Skip to content

Commit 27702b8

Browse files
committed
[E:61/533, M:57/974, H:6/387] add No: 27 Remove Element
1 parent 371330f commit 27702b8

File tree

13 files changed

+598
-1
lines changed

13 files changed

+598
-1
lines changed

questions/serial/简单/27/README.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
## [移除元素](https://leetcode-cn.com/problems/remove-element/)
2+
3+
给你一个数组 _nums _和一个值 _val_,你需要 **[原地](https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)** 移除所有数值等于 _val _的元素,并返回移除后数组的新长度。
4+
5+
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 **[原地] (https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)修改输入数组**。
6+
7+
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
8+
9+
 
10+
11+
**示例 1:**
12+
13+
`给定 _nums_ = **[3,2,2,3]**, _val_ = **3**,
14+
15+
函数应该返回新的长度 **2**, 并且 _nums_ 中的前两个元素均为 **2**
16+
17+
你不需要考虑数组中超出新长度后面的元素。
18+
`
19+
20+
**示例 2:**
21+
22+
`给定 _nums_ = **[0,1,2,2,3,0,4,2]**, _val_ = **2**,
23+
24+
函数应该返回新的长度 **`5`**, 并且 _nums_ 中的前五个元素为 **`0`**, **`1`**, **`3`**, **`0`**, **4**
25+
26+
注意这五个元素可为任意顺序。
27+
28+
你不需要考虑数组中超出新长度后面的元素。
29+
`
30+
31+
 
32+
33+
**说明:**
34+
35+
为什么返回数值是整数,但输出的答案是数组呢?
36+
37+
请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
38+
39+
你可以想象内部操作如下:
40+
41+
`// **nums** 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
42+
int len = removeElement(nums, val);
43+
44+
// 在函数里修改输入数组对于调用者是可见的。
45+
// 根据你的函数返回的长度, 它会打印出数组中 **该长度范围内** 的所有元素。
46+
for (int i = 0; i < len; i++) {
47+
    print(nums[i]);
48+
}
49+
`
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/简单/27/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input1 []int
18+
input2 int
19+
want int
20+
}{
21+
{
22+
name: "test-[1]-1",
23+
input1: []int{1},
24+
input2: 1,
25+
want: 0,
26+
},
27+
{
28+
name: "test-[2]-3",
29+
input1: []int{2},
30+
input2: 3,
31+
want: 1,
32+
},
33+
{
34+
name: "test-[2,3]-3",
35+
input1: []int{2, 3},
36+
input2: 3,
37+
want: 1,
38+
},
39+
{
40+
name: "test-[0,4,4,0,4,4,4,0,2]-4",
41+
input1: []int{0, 4, 4, 0, 4, 4, 4, 0, 2},
42+
input2: 4,
43+
want: 4,
44+
},
45+
{
46+
name: "test-[3,3]-3",
47+
input1: []int{3, 3},
48+
input2: 3,
49+
want: 0,
50+
},
51+
{
52+
name: "test-[3,2,2,3]-3",
53+
input1: []int{3, 2, 2, 3},
54+
input2: 3,
55+
want: 2,
56+
},
57+
{
58+
name: "test-[0,1,2,2,3,0,4,2]-2",
59+
input1: []int{0, 1, 2, 2, 3, 0, 4, 2},
60+
input2: 2,
61+
want: 5,
62+
},
63+
}
64+
65+
testLog := leet.NewTestLog(len(tests))
66+
defer testLog.Render()
67+
68+
timeoutDuration := time.Second * 2
69+
70+
for idx, test := range tests {
71+
// 超时检测
72+
got := test.want
73+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
74+
got = solution.Export(test.input1, test.input2)
75+
cancel()
76+
})
77+
78+
if timeout {
79+
testLog.Fail(idx+1, test.name, "timeout")
80+
continue
81+
}
82+
83+
if !reflect.DeepEqual(test.want, got) {
84+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
85+
continue
86+
}
87+
88+
testLog.Pass(idx+1, test.name)
89+
}
90+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int, val int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums, val)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return removeElement(nums, val)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func removeElement(nums []int, val int) int {
29+
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int, val int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums, val)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return removeElement(nums, val)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func removeElement(nums []int, val int) int {
29+
30+
}

questions/store.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
## [移除元素](https://leetcode-cn.com/problems/remove-element/)
2+
3+
给你一个数组 _nums _和一个值 _val_,你需要 **[原地](https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)** 移除所有数值等于 _val _的元素,并返回移除后数组的新长度。
4+
5+
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 **[原地] (https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)修改输入数组**。
6+
7+
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
8+
9+
 
10+
11+
**示例 1:**
12+
13+
`给定 _nums_ = **[3,2,2,3]**, _val_ = **3**,
14+
15+
函数应该返回新的长度 **2**, 并且 _nums_ 中的前两个元素均为 **2**
16+
17+
你不需要考虑数组中超出新长度后面的元素。
18+
`
19+
20+
**示例 2:**
21+
22+
`给定 _nums_ = **[0,1,2,2,3,0,4,2]**, _val_ = **2**,
23+
24+
函数应该返回新的长度 **`5`**, 并且 _nums_ 中的前五个元素为 **`0`**, **`1`**, **`3`**, **`0`**, **4**
25+
26+
注意这五个元素可为任意顺序。
27+
28+
你不需要考虑数组中超出新长度后面的元素。
29+
`
30+
31+
 
32+
33+
**说明:**
34+
35+
为什么返回数值是整数,但输出的答案是数组呢?
36+
37+
请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
38+
39+
你可以想象内部操作如下:
40+
41+
`// **nums** 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
42+
int len = removeElement(nums, val);
43+
44+
// 在函数里修改输入数组对于调用者是可见的。
45+
// 根据你的函数返回的长度, 它会打印出数组中 **该长度范围内** 的所有元素。
46+
for (int i = 0; i < len; i++) {
47+
    print(nums[i]);
48+
}
49+
`
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/简单/27/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input1 []int
18+
input2 int
19+
want int
20+
}{
21+
{
22+
name: "test-[1]-1",
23+
input1: []int{1},
24+
input2: 1,
25+
want: 0,
26+
},
27+
{
28+
name: "test-[2]-3",
29+
input1: []int{2},
30+
input2: 3,
31+
want: 1,
32+
},
33+
{
34+
name: "test-[2,3]-3",
35+
input1: []int{2, 3},
36+
input2: 3,
37+
want: 1,
38+
},
39+
{
40+
name: "test-[0,4,4,0,4,4,4,0,2]-4",
41+
input1: []int{0, 4, 4, 0, 4, 4, 4, 0, 2},
42+
input2: 4,
43+
want: 4,
44+
},
45+
{
46+
name: "test-[3,3]-3",
47+
input1: []int{3, 3},
48+
input2: 3,
49+
want: 0,
50+
},
51+
{
52+
name: "test-[3,2,2,3]-3",
53+
input1: []int{3, 2, 2, 3},
54+
input2: 3,
55+
want: 2,
56+
},
57+
{
58+
name: "test-[0,1,2,2,3,0,4,2]-2",
59+
input1: []int{0, 1, 2, 2, 3, 0, 4, 2},
60+
input2: 2,
61+
want: 5,
62+
},
63+
}
64+
65+
testLog := leet.NewTestLog(len(tests))
66+
defer testLog.Render()
67+
68+
timeoutDuration := time.Second * 2
69+
70+
for idx, test := range tests {
71+
// 超时检测
72+
got := test.want
73+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
74+
got = solution.Export(test.input1, test.input2)
75+
cancel()
76+
})
77+
78+
if timeout {
79+
testLog.Fail(idx+1, test.name, "timeout")
80+
continue
81+
}
82+
83+
if !reflect.DeepEqual(test.want, got) {
84+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
85+
continue
86+
}
87+
88+
testLog.Pass(idx+1, test.name)
89+
}
90+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int, val int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums, val)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return removeElement(nums, val)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func removeElement(nums []int, val int) int {
29+
30+
}

0 commit comments

Comments
 (0)