标签:空间复杂度 family ret 怎么 操作 string 算法 字符串 code
7-2 删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案。
输入格式:第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:输出最小数。
输入样例:在这里给出一组输入。例如:
178543
4
输出样例:在这里给出相应的输出。例如:
13
运用贪心算法求解,从前往后比较,若第i个数比第i+1个数大,则用第i+1个数覆盖第i个数,否则继续,直到最后一个数;如果被覆盖的数的个数少于题目要求删掉的个数,继续重复覆盖操作。
代码如下:
1 #include<string.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int i ,k; 7 char a[100]; 8 cin>>a>>k; 9 int len = strlen(a); 10 while (k>0){ 11 i=0; 12 while(i<len&&a[i]<=a[i+1])i++; 13 while(i<len){ 14 a[i]=a[i+1]; 15 i++; 16 } 17 k--; 18 } 19 i=0; 20 while(a[i]==‘0‘&&i<len) 21 i++; 22 if (a[i]==‘\0‘)cout<<‘0‘; 23 else{ 24 for(int j=i;j<len;j++) 25 cout<<a[j]; 26 } 27 return 0; 28 } 29
时间复杂度:代码的核心算法有两重循环,循环次数是k*n(k是删除的个数,n是正整数a的位数),所以时间复杂度是O(kn);
空间复杂度:使用了一个数组来存储n位正整数a,所以空间复杂度是O(n);
做这道题主要是卡在了输出那里,因为考虑问题不够全面,没有对最后得到的字符串前导的0进行处理,导致很多测试点都过不了,最后通过向老师以及班里的同学请教,终于解决了。还有就是,当局者迷旁观者清,有时候自己写出来的东西,明明就是有bug,但就是怎么看都看不出问题来,而旁人一眼就看出来哪里有问题,所以实在找不出问题的时候,请教别人可以避免浪费时间。
标签:空间复杂度 family ret 怎么 操作 string 算法 字符串 code
原文地址:https://www.cnblogs.com/xm-dream/p/10050603.html