给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
算法的原理应该是说从最高位开始,一次向低位搜索,一旦遇到前一位(高位)的数大于当前位,则删去前一位,直到删除k个数,如果到达末尾还没有删除k个,则说明现在这个数已经是从小到大排序了,则从最低位开始删除要求的位数。
代码1:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
string a;
int n;
while(cin >> a >> n)
{
int m=a.size();
for(int j=0; j<n; j++)
{
int flag=0;
for(int i=0; i<m; i++)
if(a[i]>a[i+1])
{
a.erase(a.begin()+i);
flag=1;
break;
}
if(!flag)
a.erase(a.end()-j,a.end());
}
cout << a<< endl;
}
return 0;
}
代码2:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
char a[105];
int n;
while(cin >> a >> n)
{
int m=strlen(a);
while(n--)
{
int i=0;
while(i<m-1&&a[i]<=a[i+1])
{
i++;
}
if(i==m-1)
{
m--;
while(n--)
m--;
break;
}
else
{
for(int j=i;j<m-1;j++)
a[j]=a[j+1];
m--;
}
}
for(int i=0;i<m;i++)
printf("%c",a[i]);
cout << endl;
}
return 0;
}