移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- num 的长度小于 10002 且 ≥ k。
- num 不会包含任何前导零。
示例 1 :
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :
输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
思路+代码+注释:
public String removeKdigits(String num, int k) {
/*
思路:使用res保存结果,遍历每一个数字,如果res为空那么将数字添加到res中;如果res不为空,并且k大于0还能移除元素,并且res的最后一个元素大于当前
数字那么移除res最后一个元素k--,继续循环直到res为空或者k为0或者res的最后一个元素小于c为空,将当前数字添加到res中
结果可能存在前置0,所以扫描一遍去除前置0
*/
List<Character> characterList=new ArrayList<>();
char[] chars=num.toCharArray();
for (char c:chars
) {
while (characterList.size()>0 && k>0 && characterList.get(characterList.size()-1)>c)
{
characterList.remove(characterList.size()-1);
k--;
}
characterList.add(c);
}
//k可能大于0,那么将res中后面的k个元素移除
for (int i = 0; i < k; i++) {
characterList.remove(characterList.size()-1);
}
StringBuilder res=new StringBuilder();
boolean flag=false;
for (int i = 0; i < characterList.size(); i++) {
if (characterList.get(i)!='0')
{
res.append(characterList.get(i));
flag=true;
}else {
if (flag)
{
res.append(characterList.get(i));
}
}
}
//代表结果全为0,返回0
if (!flag)
{
return "0";
}
return res.toString();
}