删数问题
题目描述
在给定的n个数字的数子串,删除其中k(k<n)个数字后,剩下的数字按照原次序组成一个新的正整数。使得剩下的数字组成的新正整数最小。
解题思路
贪心思想,每次从左到右,删除第一个大于后者的元素,如果没有,说明是已经降序排列,就从后面依次删除。
具体代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
void Delete(char num[],int n,int k){
int last=n-1;
int numMark[N]; //用作标记的数组,成员记为1表示删除,记为0表示未删除
for(int i=0;i<N;i++) //初始化标记数组
numMark[i]=0;
int next=0;//记录下一个未标记删除的下标
for(int i=1;i<=k;i++){ //删除k个数
for(int j=0;j<n;j++){ //遍历数组
if(j==last){ //如果是最后一个元素,那么直接删除
numMark[last]=1;
last--; //删除最后一个元素后,缩小后边界
break;
}
while(next<=j||numMark[next]==1){ //找到j之后第一个未被标记的下标
next++;
}
if(numMark[j]!=1&&num[j]>num[next]){ //如果发现降序,则删除
numMark[j]=1;
break;
}
}
next=0;
}
for(int i=0;i<n;i++){ //输出未被删除的数
if(numMark[i]==0){
printf("%c",num[i]);
}
}
}
int main(){
char num[N];
int n,k;
int i=0;
printf("请输入数字数组:");
while(1){
num[i]=getchar();
if(num[i]=='\n')
break;
i++;
}
n=i; //记录下共有整数n位
printf("请输入需要删除的数字个数(k):");
scanf("%d",&k);
Delete(num,n,k);
return 0;
}