思路
- 123456789,类似于这种数,要保证栈是个单调递增的栈,这样才能保证前面的位数是最小的
- 125541212,当遇到的数比栈顶小时,栈顶要一直弹出,直到栈顶是比当前的数小于等于
- 单调栈,遇到了好几次了,一般单调栈里都会有while,保证栈顶在不合要求时一直弹出
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char * removeKdigits(char * num, int k){
int len = strlen(num);
if(len<=k)
return "0";
if(k==0)
return num;
char *stack = (char*)malloc(sizeof(char)*(len+1));
int top=-1,i=0;
while (k>0&&i<len)
{
if(top==-1)
stack[++top]=num[i++];
else{
while(top>-1&&stack[top]>num[i]&&k){//这个地方保证是单调栈,当前的数一直比栈顶小时,栈顶一直弹出
top--;
k--;
}
stack[++top]=num[i++];//当前的数比栈顶大,直接入栈
}
}
while (k--)//k可能没有用完,可能数就是单调递增 123456
top--;
while (i<len)//k用完了,但是数还没数到最后 54321 2
stack[++top] =num[i++];
stack[++top] = '\0';//c语言字符串
i=0;
k=0;
while(stack[i]=='0')//从不为0的地方开始
i++;
while (i<len)//移位
stack[k++]=stack[i++];
if(strlen(stack)==0)//全0 长度为0
return "0";
return stack;
}
int main(){
char s1[] = "1173";
char *re = removeKdigits(s1,2);
printf("re = %s\n",re);
}