贪心思想
最高位要尽可能的小,次高位也是要保留小的数字。所以遍历这个string时遇到比前一位小的数字的话,就要把前一位删掉,把当前这一位保存进去。
用一个vector模拟栈,注意一些情况,1.当前的数如果是0怎么办,因为0不能做最高位,所以要判断结果res中是否为空,不为空的话,0才可以加入。2.如果string 都遍历完了,k还大于0怎么办,出现这种情况的原因是string的每一位是递增关系。3.结果为空返回“0”
class Solution {
public:
string removeKdigits(string num, int k) {
vector<int>res;//模拟栈
string str = "";//结果string
//遍历Num的每位
for(int i =0;i<num.size();++i)
{
int number = num[i] - '0';//先转成int
//如果res中有数的话,并且现在正在遍历的这个数小于“栈顶”元素,并且k的值还没有用完的话
//就把栈顶元素(也就是末尾元素)弹出来,然后可用次数减1
while(res.size()!=0 && number < res[res.size()-1] && k>0)
{
res.pop_back();
k--;
}
//如果当前这个数不是0的话,就可以直接放入,或者,如果是0的话,那就看“栈”中还有没数,有的话,也可以直接加入
if(number!=0 || res.size()!=0)
{
res.push_back(number);
}
}
//遍历结束后,有可能k没有用完,比如Num= 12345,k=2,遍历结束时k还是=2
while(res.size()!=0 && k>0)
{
res.pop_back();
k--;
}
//最后将res中的int连接成string
for(int i =0;i<res.size();++i)
{
str.append(1,'0'+res[i]);
}
if(str == "")//特殊情况
str = "0";
return str;
}
};