sincerit 删去几个数,使剩下的数最大(经典问题)

给一个只含数字的字符串s,从中正好删掉m个数字,求剩下的最大的数字字符串(不含前导0)?

#include <stdio.h>
#include <string.h>
char num[100];
int main() {
  int n, k; // n个数删除k个数 
  scanf("%d %d", &n, &k);
  memset(num, 0, sizeof(num));
  scanf(" %s", &num);
  for (int i = 1; i < n;) {
    if (num[i] > num[i-1]) {
      for (int j = i; j < n; j++) num[j-1] = num[j];
      n--;
      k--;
      if (k == 0) break;
      i = 1;
    } else i++;
  }
  // n-k是因为如果k还有剩而数字已经没法再删除了,那就要删后面的数字 
  for (int i = 0; i < n-k; i++) printf("%c", num[i]);
}

求删除几个数使剩下的数最小?

#include <stdio.h>
#include <string.h>
int main() {
  char num[100];
  int n, k;
  scanf("%d %d", &n, &k);
  memset(num, 0, sizeof(num));
  scanf(" %s", num);
  for (int i = 1; i < n;) {
    if (num[i] < num[i-1]) { // 后面的比前面的小,那就删去前面的 
      for (int j = i; j < n; j++) num[j-1] = num[j];
      k--;
      n--;
      if (k == 0) break;
      i = 1;
    } else i++;
  }
  
  int b = 0;
  // 特殊情况字符串都变成了0, 去前导0 
  while (b < n && num[b] == '0') b++;
  if (b == n) printf("0\n");
  else for (int i = b; i < n-k; i++) printf("%c", num[i]); 
}
/*
6 3
120080
0
*/

猜你喜欢

转载自blog.csdn.net/sincerit/article/details/85842823