402. 移掉K位数字

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

注意:

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

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

class Solution {
public:
    //得利用栈来解决。思路是贪心:1 4 3 2 2 1 9其实当num[i] < num[i-1]时,删除num[i-1]
    string removeKdigits(string num, int k) {
        stack<char> s;
        int i=0;
        while(k&&i<num.size()){
            if(s.size()==0||s.top()<=num[i]){
                s.push(num[i]);
                i++;
                continue;
            }
            if(s.size()>0&&s.top()>num[i]){
                k--;
                s.pop();
            }   
        }
        while(i<num.size()){
            s.push(num[i]);
            i++;
        }
        while(k){
            if(s.size()>0){
                k--;
                s.pop();
            }else{
                break;
            }
        }
        string res;
        while(s.size()){
            res.push_back(s.top());
            s.pop();
        }
        reverse(res.begin(),res.end());
        while(res.size()>0&&res[0] == '0'){
            res.erase(res.begin());
        }
        if(res.size() == 0){
            return "0";
        }
        return res;
    }
};

  优化

class Solution {
public:
//优化,直接 把result结果作为栈使用
    string removeKdigits(string num, int k) {
        string result;
        for(int i=0;i<num.size();i++){
            while(result.size()>0&&k>0&&num[i] < result.back()){
                result.pop_back();
                k--;
            }
            if(result.size()==0&&num[i]=='0')
                continue;
            result.push_back(num[i]);
        }
        while(k&&result.size()>0){
            k--;
            result.pop_back();
        }
        if(result == ""){
            return "0";
        }
        return result;
    }
};

 

上一篇:从0开始学算法--排序(1.9基数排序)


下一篇:《402团队》:团队项目选题报告