NC219 移掉 K 位数字
移掉 K 位数字
https://www.nowcoder.com/practice/0fe685c8272d40f1b9785fedd2499c1c?tpId=196&tqId=39412&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=581&title=
单调栈
import java.util.*;
public class Solution {
public String removeKnums (String num, int k) {
//定义一个单调栈用于求删除k位后能得到的最小的整数
Stack<Integer> stack1=new Stack<>();
int n=num.length();
//遍历整个字符串的每一位
//先将字符串的第i位的数字字符转化为数字,用charAt函数用来定位获得字符串的第i位
for(int i=0;i<n;i++){
int c=num.charAt(i)-'0';
//栈1如果不为空,并且删除的数字的个数还没达到k个,并且栈顶的元素的值大于要入栈的元素,就表明可以用当前的元素来替换之前的元素,即将之前的元素进行删除,这样可以得到最大的数字
while(!stack1.isEmpty()&&k>0&&stack1.peek()>c){
stack1.pop();
k--;
}
//将该元素进行入栈
stack1.push(c);
}
//例如100999,则运行到这里的时候栈中的元素:00999
//由于只删除了一个元素,所以继续进行删除
while(!stack1.isEmpty()&&k>0){
stack1.pop();
k--;
}
//创建一个新的栈,用于辅助反转00999,让0在栈的上面,将前导0删除
Stack<Integer> stack2=new Stack<>();
while(!stack1.empty()){
stack2.push(stack1.pop());
}
while(!stack2.empty()&&stack2.peek()==0){
stack2.pop();
}
//用StringBuilder的无参构造函数创建一个字符串
StringBuilder ans=new StringBuilder();
//只要栈2不为空,就将对应的元素append加到字符串的后面
while(!stack2.empty()){
ans.append(stack2.pop());
}
//判断一下字符串ans的长度,如果长度为0,就返回“0”,否则就返回ans.toString()
return ans.length()>0?ans.toString():"0";
}
}