本题题目大意是给出一个数字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;
}