算法第4章实践报告
算法第4章实践报告
1.实践题目
7-2 删数问题
2.问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案.
3.算法描述
if(n==strlen(a)){ // 删除的长度跟数字长度一样的时候输出为0 cout << 0; return 0; } while(n>0) { i=0; while(i<strlen(a) && a[i]<=a[i+1] ) //如果左边比右边大,删除 i++; for(j=i;j<strlen(a);j++) a[j]=a[j+1]; int k; while(a[0] == '0'){ //如果首位为0,将0删掉 k = 0; while(k < strlen(a)){ a[k] = a[k+1]; k++; } } n--; } cout << a << endl;
4.算法时间及空间复杂度分析
时间复杂度分析:判断删除长度跟数字长度的时间复杂度为常数;第一个while大循环循环了n次,大while循环里还有for循环和小的while循环,其循环次数为数字a的长度次,约等于n次,总的时间复杂度为O(n2)。
空间复杂度分析:定义了一个一维数组,空间复杂度为S(n)。
5.心得体会
一开始跟队友在怎么把数字转换为数组这个问题上纠结了很久,但是发现转为数组之后,怎么改测试点都不能通过,最后就在百度上查找了这种比较方式。还有将前置0删掉的问题,本来以为是删掉前置0后继续删除n个数字,后来才发现是删除完n个数字之后再把前置0删掉,如果题目可以说清楚的话可以省去一些纠结的时间。