移掉K位数字

贪心思想

最高位要尽可能的小,次高位也是要保留小的数字。所以遍历这个string时遇到比前一位小的数字的话,就要把前一位删掉,把当前这一位保存进去。

用一个vector模拟栈,注意一些情况,1.当前的数如果是0怎么办,因为0不能做最高位,所以要判断结果res中是否为空,不为空的话,0才可以加入。2.如果string 都遍历完了,k还大于0怎么办,出现这种情况的原因是string的每一位是递增关系。3.结果为空返回“0”

class Solution {
public:
    string removeKdigits(string num, int k) {
        vector<int>res;//模拟栈
        string str = "";//结果string
        //遍历Num的每位
        for(int i =0;i<num.size();++i)
        {
            int number = num[i] - '0';//先转成int
            //如果res中有数的话,并且现在正在遍历的这个数小于“栈顶”元素,并且k的值还没有用完的话
            //就把栈顶元素(也就是末尾元素)弹出来,然后可用次数减1
            while(res.size()!=0 && number < res[res.size()-1] && k>0)
            {
                res.pop_back();
                k--;
            }
            //如果当前这个数不是0的话,就可以直接放入,或者,如果是0的话,那就看“栈”中还有没数,有的话,也可以直接加入
            if(number!=0 || res.size()!=0)
            {
                res.push_back(number);
            }
        }
        //遍历结束后,有可能k没有用完,比如Num= 12345,k=2,遍历结束时k还是=2
        while(res.size()!=0 && k>0)
        {
            res.pop_back();
            k--;
        }
        //最后将res中的int连接成string
        for(int i =0;i<res.size();++i)
        {
            str.append(1,'0'+res[i]);
        }
        if(str == "")//特殊情况
            str = "0";
        return str;
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_22080999/article/details/80465162