LeetCode 402. 移掉K位数字

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

注意:

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

示例 1 :

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

示例 2 :

输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。

思路:若要去掉某一个数字,为了使得到的新数字最小,需要尽可能的让新数字优先最高位最小,其次次高位最小。。。。,这样我们可以用一个栈的模型(存放新的数字),先把原高位压入,然后再把次高位压入,如果次高位小于最高位,那么压入之前就先把之前压入的原最高位弹出,相当于删除,如果栈还没有空,栈顶还小就继续弹出,没弹出一次K减一,说明用掉了一次弹出的机会,直到栈为空,后K=0删除机会用完。

值得思考的是:

(1)如果有0这个数字呢?

number不为0时,如果栈为空,可以push进去。
number不为0时,如果栈不为空,可以push进去。
number为0时,如果栈为空,那么数字的高位为0,根据
第二个例子;不用进行push。
如果number为0时,如果栈不为空,那么进行push

(2)所有数字扫描完k>0;

当全部都push进栈,K还没有减完时,把低位去掉

class Solution {
public:
    string removeKdigits(string num, int k) {
        int size=num.length();
        int i=0;
        vector  s;   //使用vector 当做栈,原因是vector可以遍历
        string  str="";    //用来存储最终结果
        while (i0&&k>0&&s[s.size()-1]>number&&k>0){
                s.pop_back();
                k--;
                
            }
            if (s.size()!=0||number!=0){    //number不为0时,如果栈为空,可以push进去。
                s.push_back(number);        //number不为0时,如果栈不为空,可以push进去。
            }                               //number为0时,如果栈为空,那么数字的高位为0,根据
            i++;                            //第二个例子;不用进行push。
        }                                   //如果number为0时,如果栈不为空,那么进行push
        while (s.size()!=0&&k>0){        //当全部都push进栈,K还没有减完时,把低位去掉
            s.pop_back();
            k--;
        }
        for (int i=0;i

注:string &append(int n, char c); //在当前字符串结尾添加n个字符c

 

 

你可能感兴趣的:(LeetCode刷题之贪心算法)