LeetCode 402. Remove K Digits

来源:互联网 发布:sql复制表结构 编辑:程序博客网 时间:2024/05/24 00:07

本题题目大意是给出一个数字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
原创粉丝点击