1、题目来源:选自LeetCode 402:
2、问题描述:
3、问题分析
通过分析我们可以得出这样的结论:如果后一个数字比前面的数字小的话,那么我们就要把前面的一个数字删除掉,并且每次把字符串中拆出来的数字push进栈的时候要考虑特殊情况:当栈不为空的时候可以把数字0存进去,反之如果栈为空且数字为0,那么这时候0就不能入栈;如果for循环结束但是K的值依然还是大于0.例如字符串为“12345” k=2就会出现这样的情况,我们就要在删除后面的较大的数字才能符合题意。
4、实现代码:
1 public String removeKdigits(String num, int k) { 2 Stack<Integer> stack=new Stack<Integer>(); 3 Stack<Integer> temp_stack=new Stack<Integer>(); 4 int size=0; 5 String result=""; 6 //这个循环结束就能把一般情况下需要删除几个数字的情况解决完毕 7 for(int i=0;i<num.length();i++){ 8 int number=num.charAt(i)-'0'; 9 //当栈不为空、当前的number<栈顶元素、k的值为大于0的情况下,弹出栈顶元素 10 while(stack.size()!=0&&stack.peek()>number&&k>0){ 11 stack.pop(); 12 k--; 13 } 14 //当栈不为空或者将要入栈的number不是0的情况下都可以直接入栈 15 //(这其实已经包含了很多中情况了) 16 if(number!=0||stack.size()!=0){ 17 stack.push(number); 18 } 19 } 20 while(stack.size()!=0&&k>0){ 21 stack.pop(); 22 k--; 23 } 24 while(stack.size()!=0){ 25 temp_stack.push(stack.pop()); 26 } 27 size=temp_stack.size(); 28 for(int i=0;i<size;i++){ 29 char temp=(char) (temp_stack.pop()+'0'); 30 result+=temp; 31 } 32 if(result==""){ 33 result="0"; 34 } 35 return result; 36 }