LeetCode 402. Remove K Digits

本题题目大意是给出一个数字num(string形式),要求删除其中的k位,使得删除后得到的数字最小。比如num = “1432219”, k = 3,则输出就应该是”1219”。

这一题可以用贪心的思想解决,删除k位其实就相当于k次删除一位,给出一个数字,删除一位的策略很明显就是删除一个尽量靠前且尽量大的数字,比如例子中的”1432219”,显然删除4最好,依据是显然删除大的数字好,但因为不能改变顺序,num中靠前的数字在结果中也靠前,重要性更高,所以要尽量靠前且尽量大,转化一下就是从num的头开始找,找到第一个下降前的数字中最大的一个,然后删除,重复k次。

这里要注意题目要求输出的数字中不能有‘0’打头,那就找到第一个不是‘0’的数并把前边的‘0’全部删除就可以了,如果都是‘0’就要记得返回一个“0”。

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Solution {

  public:
    string removeKdigits(string num, int k) {
        if (num.empty() || k == 0)
            return num;

        string::iterator erase_it;
        while (k--) {
            erase_it = num.begin();
            for (string::iterator it = num.begin() + 1; it != num.end(); ++it) {
                if (*erase_it < *it)
                    erase_it = it;
                else if (*erase_it > *it)
                    break;
            }
            num.erase(erase_it);
        }

        size_t found = num.find_first_not_of("0");
        if (found == string::npos)
            num = "0";
        else
            num = num.substr(found);

        return num;
    }

};

int main(int argc, char const *argv[]) {
    Solution s;
    cout << s.removeKdigits("100200", 2) << endl;

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值