LeetCode移掉K个数字

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

没有什么好说的,这个就是一个贪心。把前面的数都尽可能变得小。
其实一开始我想的是另一个问题,是连续删除几个数字。难度当然是变小了。只需要从头找到尾巴之前的k个值。
我发现的自己和题解的差距就在于,一致性的不足。我的头或者尾巴需要自己的特殊处理,不如说是一种化归。而题解似乎都是顺顺利利都是一个范式的。这个真的需要良好的设计吧。

容我多问几句,到底这些零零散散的访问量是从哪里来的。
我感觉自己的博客是不会被搜索到的。

class Solution {
public:
    string removeKdigits(string num, int k) {
        vector<char> stk;
        for(auto& digit: num){
            while(stk.size() > 0 && stk.back() > digit && k){
                stk.pop_back();
                k -= 1;
            }
            stk.push_back(digit);
        }
        while(k>0){
            stk.pop_back();
            k--;    
        }
        string ans="";
        int i=0;
        int n=stk.size(); 
        while(n&&stk[i]=='0'){
            i++;
            n--;
        }
        if(n==0) return "0";
        else{
            for(int j=0;j<n;j++)
                ans+=stk[i++];
            return ans==""?"0":ans;
        }
    }
};

顺便记一下C++吧。也就是说,pop_back()是把尾巴元素弹出,string类里面+符号重载,进行了后缀添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值