Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

2组:537

3组:402
3组:402 [402-移掉K位数字](details/402-移掉K位数字.md)

4组:114

Expand Down
60 changes: 60 additions & 0 deletions details/402-移掉K位数字.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
### 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。

示例 1 :
输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

示例 2 :
输入: num = “10200”, k = 1
输出: “200”
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :
输入: num = “10”, k = 2
输出: “0”
解释: 从原数字移除所有的数字,剩余为空就是0。

### 题解:
从高位开始走,如果下一个数字比当前数字小,且要删除的数字次数没用完,则删除当前位置的数字,且继续向前比较,这样总能得到一个较小的序列。
需要注意几个零界点:前边为0的数字和最后一位数字需要单独处理。

代码如下:

```java
public static String removeKdigits(String num, int k) {
if(num == null || "".equals(num) || num.length() <= k) {
return "0";
}
char[] array = new char[num.length()];
array[0] = num.charAt(0);
int size = 1;
for (int i = 1; i < num.length(); i++) {
if(array[size-1] > num.charAt(i)){
while (k > 0 && size > 0) {
if(array[size - 1] > num.charAt(i)) {
size--;
k--;
} else break;
}
}
array[size++] = num.charAt(i);
}
int begin = 0;
for (; begin < size; begin++) {
if(array[begin] != '0')
break;
}
String result = new String(array,begin,size-begin-k);
if(result.length() == 0) {
return "0";
}
return result;
}
```