算法第四章实践报告
1、实践题目:删数问题
2、问题描述:
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
3、算法描述:
用字符串数组a[k]记录n位正整数a,对正整数a进行“从最高位向最低位”的扫描,设flag记录当前扫描到的位置,比较flag位的数字和falga+1位的数字,若比较结果是“<=”,则flag+1,继续向后扫描;若比较结果是">",则所有flag后的数字向前移动一位,代表删掉flag位上的数字。
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 char a[1005]; 5 int main() 6 { 7 int k,n = 0; 8 cin >> a >> k; 9 int len = strlen(a); 10 if (k >= len) //如果要删除的数字数目k比n大,直接返回0 11 { 12 cout << 0; 13 } 14 while (k > 0) //判断是否已经删除足够多的数字 15 { 16 int i = 0; 17 while (i <= len && a[i] <= a[i+1]) 18 { 19 i++; 20 } 21 for (int j = i; j <= len; j++) 22 { 23 a[j] = a[j+1]; 24 } 25 k--; 26 len--; //字符串在删除一个数字后长度-1 27 } 28 while (a[n] == '0') 29 n++; 30 for ( ; n <= len; n++) 31 cout << a[n]; 32 return 0; 33 }
4、算法的时间及空间复杂度分析:
空间复杂度:本道题所开的数组大小必须足够容下n位数的正整数a,所以空间复杂度为O(n)
时间复杂度:按照最坏的情况,输入的n位正整数a的排列为降序,需要删掉k-1位数,那么时间复杂度位O(kn)
5、心得体会:
本次实践的心得体会是自己对编译器自带的sort函数运用还不够熟练,还有就是对字符串数组也不太熟悉,在编程方面还是需要提升。删数问题应该是实践的三道题里面最难找到贪心选择策略的一道题了,这道题是在结对编程的伙伴的帮助下才知道的,所以在贪心选择性质上还是要下点功夫才行。