对于删数问题大家都是非常的清楚,今天在做的时候发现一种更为快速的方法。
问题描述:给定n位正整数a,去掉其中任意k<=n个数字后,剩下的数字按原次序排列组成一个新的正整数。
对于给定的n位正整数a和正整数k,设计一个算法找出使剩下数字组成的新数最小的删数方案。
贪心思想:按照高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。
c++代码如下:
#include<iostream>#include<string>
using namespace std;
void shanchu(string n,int s)
{
int i,x,l,m;
i=-1,m=0,x=0;
l=n.length();
while(x<s)
{
i++;
if(n[i]>n[i+1])
/*
*当i+1的值超出n.length()的长度时,n[i]为当前的元素,
*而i+1的元素为字符串结束的标示符“\0”,而n[i]>n[i+1]
*所以程序便会删除最后一个元素。
*
*/
{
n=n.erase(i,1);//删除
x++; //计数
i=-1;//从头开始进行查找
}
}
cout<<n<<endl;
}
int main()
{
string n;
int s;
cin>>n>>s;
shanchu(n,s);
return 0;
}