Skip to content

Commit c440984

Browse files
authored
feat: add solutions to lc problem: No.0402 (doocs#864)
No.0402.Remove K Digits
1 parent 7749510 commit c440984

File tree

4 files changed

+98
-10
lines changed

4 files changed

+98
-10
lines changed

solution/0400-0499/0402.Remove K Digits/README.md

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,16 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50-
贪心算法
50+
**方法一:贪心算法**
51+
52+
前置知识:两个相同位数的数字大小关系取决于第一个不同位的数的大小。
53+
54+
基本的思路如下:
55+
56+
- 从左到右遍历数组元素;
57+
- 对于遍历到的当前元素,选择保留;
58+
- 但可以选择性丢弃前面的相邻元素,丢弃与否取决于当前元素和前面相邻元素的大小;
59+
- 根据前置知识可知当当前元素小于前面相邻元素时可以移除前面相邻的元素。
5160

5261
<!-- tabs:start -->
5362

@@ -56,15 +65,40 @@
5665
<!-- 这里可写当前语言的特殊实现逻辑 -->
5766

5867
```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'
6077
```
6178

62-
### **Java**
79+
### **Go**
6380

6481
<!-- 这里可写当前语言的特殊实现逻辑 -->
6582

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+
}
68102
```
69103

70104
### **TypeScript**

solution/0400-0499/0402.Remove K Digits/README_EN.md

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,45 @@
4242

4343
## Solutions
4444

45+
**Approach 1: Greedy Algorithm**
46+
4547
<!-- tabs:start -->
4648

4749
### **Python3**
4850

4951
```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'
5161
```
5262

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+
}
5784
```
5885

5986
### **TypeScript**
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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'

0 commit comments

Comments
 (0)