算法leetcode402

贪心算法

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

num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。

示例 1 :

输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

算法分析:
因为最高位的数据要越小越好,所以从最高位开始判断,当下一个数据小于上一位时,可以把当前数据给删除,例如添加完14后,3比4要小,就应该保留3把4给移除,也有可能会出现123456这样的顺序数据,那就从最后的位数开始删除操作就行了。可以用来对数据进行储存,把第一个数据存入栈中,只要接下来的数据小于栈顶的数据,那就把栈顶的数据弹出,k- -;
具体代码实现为:

class Solution {
    public String removeKdigits(String num, int k) {
        if(k >= num.length()){
            return "0";
        }
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        for(;i < num.length(); i++){
            if(k == 0){
                break;
            }
            int val = num.charAt(i) - '0';//取字符串的ASCII码  
            while(!stack.isEmpty()&& val < stack.peek() && k>0){
                stack.pop();
                k--;
            }
            if(!stack.isEmpty() || val != 0){
                stack.push(val);
            }
        }
        while(k>0){ //当字符串为逆序排列时,从尾部删除k个数字
            stack.pop();
            k--;
        }
        StringBuilder str = new StringBuilder();//使用可变序列字符串
        while(!stack.isEmpty()){
            str.insert(0,String.valueOf(stack.pop()));
        }
        if(i < num.length()){ //如果k提前为0,只需要把num的剩余数据进行拼接
            str.append(num.substring(i));
        }
        return str.length() == 0? "0":str.toString();
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值