leetcode-402 移掉K位数组

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

注意:

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

示例 1 :

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

针对该问题,显然很好的解决办法便是贪心
从高位开始遍历整数,即在移除的数字在k的范围内,尽可能选择移除较小的数值

实现上使用栈的形态进行管理,栈保存最终的移除后的结果,并且动态变化;当出现元素小于栈顶元素的情况下将栈顶元素移除,在栈不为空或者 元素不等于零时 将该元素放入栈中。

实现如下:

string removeKdigits(string num, int k) {
    vector<int> S;
    string result = "";
    for (int i = 0;i < num.length(); ++i) {
        int number = num[i] - '0';
        while(S.size() != 0 && S[S.size() - 1] > number && k) {
            S.pop_back();
            k--;
        }

        if (number != 0 || S.size()) {//处理前导零的情况
            S.push_back(number);
        }
    }

    while(S.size() && k) {
        S.pop_back();
        k--;
    }

    for (int i = 0;i < S.size(); ++i) {
        result.append(1,'0' + S[i]);
    }

    if (result == "") {
        return "0";
    }
    return result;
}
发布了239 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Z_Stand/article/details/104210233