LeetCode 302 移掉K位数字

输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

理解:
首先从前往后判断,如果当前这个数大于后一位的数,那么这个位置就该删除
比如196 1和9比,让第一位留1肯定比9小,9和6比,把9删除肯定比6划算。
所以依次遍历即可,
但是会有些特殊情况 需要特殊处理
1.可能会有 100056 这种情况,删除掉1之后,0就不用再删除他了,继续从5,6开始
2.数列本来就递增,比如1 2 3 4 5 删除两位,那直接删除末尾
3.可能k很大,其实因为有2中地情况,k在之前没有删除数字,那么最后k剩下多少,就删除多少

用一个数组来模拟栈,如果之前的数大于当前的数,那么之前的数就要删除,也就是移除栈
否则的话判断是否栈为空
为空的话那么0就不要加入了 0作为头部没有意义 其他情况入栈

char * removeKdigits(char * num, int k){
    int len=strlen(num),top=-1;
    char *stack=(char *)malloc(sizeof(char)*(len+1));
    for(int i=0;i<len;i++){
        while(top!=-1 && k>0 && stack[top]>num[i]){top--,k--;}
        if(num[i]!='0' || top!=-1)
        stack[++top]=num[i];
    }
    if(k>0)top-=k;
    if(top<0){top=0,stack[top]='0';};
    stack[++top]='\0';
    return stack;
}

如果不理解的话,Debug一下流程就通了

发布了11 篇原创文章 · 获赞 1 · 访问量 187

猜你喜欢

转载自blog.csdn.net/z591593455/article/details/104575136