p402 移掉K位数字

移掉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的了解程度仅仅停留在语法层面我能看懂但我肯定不会自己写。。。

posted @ 2020-11-15 16:57  圆圆的圈圈  阅读(113)  评论(0)    收藏  举报