LeetCode 每日一题 2020-11-15(移掉K位数字)

本文介绍了一种中等难度的算法,如何通过删除给定非负整数 num 中的 k 位数字,以保持剩余数字最小。方法涉及动态维护数字序列,确保每次删除较大数字。适用于字符串处理和数字优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

402. 移掉K位数字

难度中等

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

注意:

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

思路:

删除K个数字剩下的数字最小,最优结果是保证删除的数为较大的数即可。

采用向量保存当前经过的数字,若是当前数字小于前面的数字,删除前面的数字(还没有删除完指定数量的数字)。

根据向量中的数字重建字符串。

    string removeKdigits(string num, int k) {

        vector<int> data;

        for(auto &c:num){

            while(k && data.size()>0 && data.back() >c  ){

                data.pop_back();

                --k;

            }

            data.push_back(c);

        }

        for(;k>0;--k){

            data.pop_back();

        }

        string ans="";

        bool isFirstZero=true;

        for(auto& C:data){

            if(isFirstZero && C=='0') continue;

            isFirstZero=false;

            ans+=C;

        }

        return ans==""? "0":ans;

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值