p402 移掉K位数字
这个题目写的时候思路好像不是很清晰,总之最开始思路是 每个元素(cur指向)和它后面一位比较,若是更大,则删除这一位。 然而忘记了删除之后,处理指针cur应当后移一位,让已处理过的元素与当前元素再重新比较来决定取舍。 于是拆了东墙补西墙甚至又用一个指针pre来暂存已处理过的最后一个结点,很麻烦而且有纰漏导致过绿不了。
最后看题解,发现整体思路没错,换成每个元素(cur)指向和它前面一位比较,若是更小,则删除前一位。 这样就不用删除之后再移动cur指针了。。。
以下是不好看的菜鸡写的c++版本:
string removeKdigits(string num, int k) {
if(k==num.size()){ //全部移除
return "0";
}
string::iterator pre=num.begin();
for(string::iterator it=num.begin()+1;it!=num.end()&&k>0;){
if(it!=num.begin()&&*it<*(it-1)){
num.erase(it-1);
k--;
it--;
}
else{
it++;
}
}
if(k>0){
int n=num.size();
num.erase(num.begin()+n-k,num.end());
}
for(string::iterator it=num.begin();it!=num.end();){
if(*it=='0'){
num.erase(it);
}
else
break;
}
if(num.size()==0){
return "0";
}
}
以下是参考大佬的python版本:
def removeKdigits(self, num:int, k:int)->str :
stack=[]
remain=len(num)-k
for digit in num:
while k and stack and stack[-1]>digit:
k-=1
stack.pop()
stack.append(digit)
return ''.join(stack[:remain]).lstrip('0') or '0'
又意识到自己对python的了解程度仅仅停留在语法层面我能看懂但我肯定不会自己写。。。

浙公网安备 33010602011771号