File tree Expand file tree Collapse file tree 4 files changed +98
-10
lines changed
solution/0400-0499/0402.Remove K Digits Expand file tree Collapse file tree 4 files changed +98
-10
lines changed Original file line number Diff line number Diff line change 47
47
48
48
<!-- 这里可写通用的实现逻辑 -->
49
49
50
- 贪心算法
50
+ ** 方法一:贪心算法**
51
+
52
+ 前置知识:两个相同位数的数字大小关系取决于第一个不同位的数的大小。
53
+
54
+ 基本的思路如下:
55
+
56
+ - 从左到右遍历数组元素;
57
+ - 对于遍历到的当前元素,选择保留;
58
+ - 但可以选择性丢弃前面的相邻元素,丢弃与否取决于当前元素和前面相邻元素的大小;
59
+ - 根据前置知识可知当当前元素小于前面相邻元素时可以移除前面相邻的元素。
51
60
52
61
<!-- tabs:start -->
53
62
56
65
<!-- 这里可写当前语言的特殊实现逻辑 -->
57
66
58
67
``` python
59
-
68
+ class Solution :
69
+ def removeKdigits (self , num : str , k : int ) -> str :
70
+ stack, remain = [], len (num)- k
71
+ for value in num:
72
+ while k and stack and stack[- 1 ] > value:
73
+ k = k- 1
74
+ stack.pop()
75
+ stack.append(value)
76
+ return " " .join(stack[:remain]).lstrip(' 0' ) or ' 0'
60
77
```
61
78
62
- ### ** Java **
79
+ ### ** Go **
63
80
64
81
<!-- 这里可写当前语言的特殊实现逻辑 -->
65
82
66
- ``` java
67
-
83
+ ``` go
84
+ func removeKdigits (num string , k int ) string {
85
+ stack , remain := make ([]byte , 0 ), len (num)-k
86
+ for i := 0 ; i < len (num); i++ {
87
+ n := len (stack)
88
+ for k > 0 && n > 0 && stack[n-1 ] > num[i] {
89
+ stack = stack[:n-1 ]
90
+ n, k = n-1 , k-1
91
+ }
92
+ stack = append (stack, num[i])
93
+ }
94
+ // 返回删除 k 个字符之后的字符串,需要去除可能存在的前置 0
95
+ for i := 0 ; i < len (stack) && i < remain; i++ {
96
+ if stack[i] != ' 0' {
97
+ return string (stack[i:remain])
98
+ }
99
+ }
100
+ return " 0"
101
+ }
68
102
```
69
103
70
104
### ** TypeScript**
Original file line number Diff line number Diff line change 42
42
43
43
## Solutions
44
44
45
+ ** Approach 1: Greedy Algorithm**
46
+
45
47
<!-- tabs:start -->
46
48
47
49
### ** Python3**
48
50
49
51
``` python
50
-
52
+ class Solution :
53
+ def removeKdigits (self , num : str , k : int ) -> str :
54
+ stack, remain = [], len (num)- k
55
+ for value in num:
56
+ while k and stack and stack[- 1 ] > value:
57
+ k = k- 1
58
+ stack.pop()
59
+ stack.append(value)
60
+ return " " .join(stack[:remain]).lstrip(' 0' ) or ' 0'
51
61
```
52
62
53
- ### ** Java**
54
-
55
- ``` java
56
-
63
+ ### ** Go**
64
+
65
+ ``` go
66
+ func removeKdigits (num string , k int ) string {
67
+ stack , remain := make ([]byte , 0 ), len (num)-k
68
+ for i := 0 ; i < len (num); i++ {
69
+ n := len (stack)
70
+ for k > 0 && n > 0 && stack[n-1 ] > num[i] {
71
+ stack = stack[:n-1 ]
72
+ n, k = n-1 , k-1
73
+ }
74
+ stack = append (stack, num[i])
75
+ }
76
+
77
+ for i := 0 ; i < len (stack) && i < remain; i++ {
78
+ if stack[i] != ' 0' {
79
+ return string (stack[i:remain])
80
+ }
81
+ }
82
+ return " 0"
83
+ }
57
84
```
58
85
59
86
### ** TypeScript**
Original file line number Diff line number Diff line change
1
+ func removeKdigits (num string , k int ) string {
2
+ stack , remain := make ([]byte , 0 ), len (num )- k
3
+ for i := 0 ; i < len (num ); i ++ {
4
+ n := len (stack )
5
+ for k > 0 && n > 0 && stack [n - 1 ] > num [i ] {
6
+ stack = stack [:n - 1 ]
7
+ n , k = n - 1 , k - 1
8
+ }
9
+ stack = append (stack , num [i ])
10
+ }
11
+ // 返回删除 k 个字符之后的字符串,需要去除可能存在的前置 0
12
+ for i := 0 ; i < len (stack ) && i < remain ; i ++ {
13
+ if stack [i ] != '0' {
14
+ return string (stack [i :remain ])
15
+ }
16
+ }
17
+ return "0"
18
+ }
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def removeKdigits (self , num : str , k : int ) -> str :
3
+ stack , remain = [], len (num )- k
4
+ for value in num :
5
+ while k and stack and stack [- 1 ] > value :
6
+ k = k - 1
7
+ stack .pop ()
8
+ stack .append (value )
9
+ return "" .join (stack [:remain ]).lstrip ('0' ) or '0'
You can’t perform that action at this time.
0 commit comments