leetcode402移掉K位数字-JAVA实现

https://leetcode-cn.com/problems/remove-k-digits/

题目:给定一个以字符串表示的非负整数 num,移除这个数中的 位数字,使得剩下的数字最小。

解析:使剩下的数字最小,可以这样想:数字位数固定,则高位的数越小,数值越小,因此要不断删掉高位的大数,使得剩下的数,从高位到低位,呈增序;

           可以利用栈来实现,即在将num每个字符压入栈时,判断栈顶元素是否大于即将入栈元素,如大于,则删除栈顶元素,如小于,则压入栈顶元素;

           利用栈来实现,最后输出的时候,需要翻转顺序;因此可以直接使用双端队列实现。

          

class Solution {
    public String removeKdigits(String num, int k) {
        //为了增删方便,利用双端队列
        Deque<Character> queue = new LinkedList<Character>();
        int len = num.length();
        for(int i = 0; i < len; i++){
            char digist = num.charAt(i);
            while(!queue.isEmpty() && k>0 && queue.peekLast() > digist){
                queue.pollLast();
                k--;
            }
            queue.offerLast(digist);
        }
        //判断删掉的个数是否等于k,小于k的话,将队列后边较大的数删掉
        for(int i = 0; i < k; i++){
            queue.pollLast();
        }

        StringBuilder stringBuilder = new StringBuilder();
        boolean leaderZero = true;

        while(!queue.isEmpty()){
            char head = queue.pollFirst();
            //如果队首为0,则跳过
            if(leaderZero && head == '0'){
                continue;
            }
            //队首不为0,用false,方便上边的&&判断
            leaderZero = false;
            stringBuilder.append(head);
        }
        return stringBuilder.length() == 0 ? "0" : stringBuilder.toString();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

localhost1212

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值