leetcode 402. 移掉K位数字 中等

题目:
在这里插入图片描述

分析:我们要得到删除后最小的数字,比较数字大小问题在实际生活中也会遇到,都是从高位开始比较,谁大则那个数字大,高位相等,往后推一位,以此类推。那么这个问题就好解决了,如果遇到左边的数字比我大,我就把它去掉。用一个栈能很好地解决这个问题,这里用到两层循环,外循环逐位遍历字符串num的字符,内循环判断栈顶与当前字符大小关系,若栈顶比当前大则删除栈顶,继续内循环,否则退出内循环并把字符添加到栈顶。
两次循环结束后还要判断特殊情况,如果字符串num是递增的,那么两次循环没有删除一个字符,这时候就从末尾删除k位即可;如果删除个数不慢k个,也从末尾删除剩余个数即可。
最终如果栈为空,即全部删除了,返回字符串0,否则拼接成字符串返回

代码:

class Solution {
    public String removeKdigits(String num, int k) {
        if(num.length() == k){
            return "0";
        }
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < num.length(); i++){
            while(!stack.empty() && k > 0){
            	//当前字符比栈顶小才删除栈顶并继续循环
                if(stack.peek() > num.charAt(i)){
                    stack.pop();
                    k--;
                }else{
                    break;
                }
            }
            //把当前字符加入到栈顶
            stack.push(num.charAt(i));  
        }
        //可能删除不够k个,则从末尾删除即可
        for(int i = 1; i <= k; i++){
            stack.pop();
        }
        StringBuilder result = new StringBuilder();
        boolean firstZero = true;
        for(char c : stack){
            //只有第一个是0才会跳过
            if(firstZero && c == '0'){
                continue;
            }
            firstZero = false;
            result.append(c);
        }
        if(result.length() == 0){
            return "0";
        }else{
            return result.toString();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

发布了134 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_40208575/article/details/104718004