53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
+ ** 方法一:暴力枚举**
57
+
58
+ 我们可以枚举字符串 $number$ 的所有位置 $i$,如果 $number[ i] = digit$,那么我们取 $number$ 的前缀 $number[ 0: i ] $ 和后缀 $number[ i+1:] $ 拼接起来,即为移除 $number[ i] $ 后的结果。我们取所有可能的结果中最大的即可。
59
+
60
+ 时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $number$ 的长度。
61
+
62
+ ** 方法二:贪心**
63
+
64
+ 我们可以枚举字符串 $number$ 的所有位置 $i$,如果 $number[ i] = digit$,记录 $digit$ 最后一次出现的位置 $last$,并且如果 $i + 1 \lt n$ 且 $number[ i] \lt number[ i + 1] $,那么我们可以直接返回 $number[ 0: i ] + number[ i+1:] $,即为移除 $number[ i] $ 后的结果。这是因为如果 $number[ i] < number[ i + 1] $,那么移除 $number[ i] $ 后,结果一定会更大。
65
+
66
+ 遍历结束,我们返回 $number[ 0: last ] + number[ last+1:] $ 即可。
67
+
68
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $number$ 的长度。
69
+
56
70
<!-- tabs:start -->
57
71
58
72
### ** Python3**
@@ -67,6 +81,19 @@ class Solution:
67
81
)
68
82
```
69
83
84
+ ``` python
85
+ class Solution :
86
+ def removeDigit (self , number : str , digit : str ) -> str :
87
+ last = - 1
88
+ n = len (number)
89
+ for i, d in enumerate (number):
90
+ if d == digit:
91
+ last = i
92
+ if i + 1 < n and d < number[i + 1 ]:
93
+ break
94
+ return number[:last] + number[last + 1 :]
95
+ ```
96
+
70
97
### ** Java**
71
98
72
99
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -89,6 +116,25 @@ class Solution {
89
116
}
90
117
```
91
118
119
+ ``` java
120
+ class Solution {
121
+ public String removeDigit (String number , char digit ) {
122
+ int last = - 1 ;
123
+ int n = number. length();
124
+ for (int i = 0 ; i < n; ++ i) {
125
+ char d = number. charAt(i);
126
+ if (d == digit) {
127
+ last = i;
128
+ if (i + 1 < n && d < number. charAt(i + 1 )) {
129
+ break ;
130
+ }
131
+ }
132
+ }
133
+ return number. substring(0 , last) + number. substring(last + 1 );
134
+ }
135
+ }
136
+ ```
137
+
92
138
### ** C++**
93
139
94
140
``` cpp
@@ -100,14 +146,36 @@ public:
100
146
char d = number[ i] ;
101
147
if (d == digit) {
102
148
string t = number.substr(0, i) + number.substr(i + 1, n - i);
103
- if (ans < t) ans = t;
149
+ if (ans < t) {
150
+ ans = t;
151
+ }
104
152
}
105
153
}
106
154
return ans;
107
155
}
108
156
};
109
157
```
110
158
159
+ ```cpp
160
+ class Solution {
161
+ public:
162
+ string removeDigit(string number, char digit) {
163
+ int n = number.size();
164
+ int last = -1;
165
+ for (int i = 0; i < n; ++i) {
166
+ char d = number[i];
167
+ if (d == digit) {
168
+ last = i;
169
+ if (i + 1 < n && number[i] < number[i + 1]) {
170
+ break;
171
+ }
172
+ }
173
+ }
174
+ return number.substr(0, last) + number.substr(last + 1);
175
+ }
176
+ };
177
+ ```
178
+
111
179
### ** Go**
112
180
113
181
``` go
@@ -125,20 +193,37 @@ func removeDigit(number string, digit byte) string {
125
193
}
126
194
```
127
195
196
+ ``` go
197
+ func removeDigit (number string , digit byte ) string {
198
+ last := -1
199
+ n := len (number)
200
+ for i := range number {
201
+ if number[i] == digit {
202
+ last = i
203
+ if i+1 < n && number[i] < number[i+1 ] {
204
+ break
205
+ }
206
+ }
207
+ }
208
+ return number[:last] + number[last+1 :]
209
+ }
210
+ ```
211
+
128
212
### ** TypeScript**
129
213
130
214
``` ts
131
215
function removeDigit(number : string , digit : string ): string {
132
- let nums = number .split (' ' );
133
- const n = nums .length ;
134
- let ans = 0 ;
135
- for (let i = 0 ; i < n ; i ++ ) {
136
- if (nums [i ] != digit ) continue ;
137
- ans = i ;
138
- if (i + 1 < n && nums [i + 1 ] > nums [i ]) break ;
216
+ const n = number .length ;
217
+ let last = - 1 ;
218
+ for (let i = 0 ; i < n ; ++ i ) {
219
+ if (number [i ] === digit ) {
220
+ last = i ;
221
+ if (i + 1 < n && number [i ] < number [i + 1 ]) {
222
+ break ;
223
+ }
224
+ }
139
225
}
140
- nums .splice (ans , 1 );
141
- return nums .join (' ' );
226
+ return number .substring (0 , last ) + number .substring (last + 1 );
142
227
}
143
228
```
144
229
0 commit comments