Skip to content
c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// 移除K个数字使得剩下的数字最小,单调栈,每轮栈顶都是最小的,每次踢掉,直到k个
// 每次后面的数字比前面的大就要去掉,去除直到k个
int main()
{
   char a[] = "1422219";
   // char a[]="10200";
   int k = 3;

   char stack[strlen(a)];
   int top = -1;

   int j = 0;
   while (j < strlen(a)) {
      // 当栈顶元素大于当前元素,且仍然可以移除字符时,弹出栈顶,注意是while
      while (top >= 0 && k > 0 && stack[top] > a[j]) {
         top--;  // 弹出栈顶
         k--;    // 减少需要移除的字符数
      }
      // 将当前字符压入栈
      stack[++top] = a[j];
      j++;
   }

   top -= k;

   for (int i = 0; i <= top; i++) {
      printf("%c", stack[i]);
   }

   return 0;
}