算法第四章实践报告
一、实践题目:7-2 删数问题
二、问题描述
给定n位正整数,去掉其中任意k <= n个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
三、算法描述
1.解法一:参考链接如下
https://blog.csdn.net/cqs_experiment/article/details/16975003
2.解法二:对于给定的一串数字,每次删除第一个左边大于右边的数字,若完全升序则删除最后一个数字,删除k次即可。输出结果的时候注意去掉前导0。
3.代码如下:
(1)删除数字
while(s > 0) { i = 0; len = strlen(a); while (i < len && a[i] <= a[i+1]) { // 遍历a[i],直到找出a[i] > a[i+1]的a[i] i++; } while (i < len) { // 移动数组元素 a[i] = a[i+1]; i++; } s--; // 重新寻找 }
(2)输出不含前导0
i = 0; len = strlen(a); while (a[i] == '0' && i < len) { i++; }
四、算法时间及空间复杂度分析(含分析过程)
1.遍历次数n x 迁移次数n,时间复杂度:O(n)。
2.空间复杂度(只有原先存储输入数据的数组):O(1)
五、心得体会(实践收获及疑惑总结)
1.实践收获:
这次实践作业是在上课时间开放的,时间控制提高了编程的强度。
对于具有明显的贪心选择性质的题目,采用贪心算法能快速解决问题,如题7-3。
对于特定的贪心算法,还可以从时间/空间复杂度入手对其进行优化,如题7-1对于新数组元素的记录。
2.疑惑总结:
7-1、7-3较水,具有明显的贪心选择。个人感觉其实在做题的时候还需要严格证明一下贪心算法的正确性。
六、参考链接
1.https://blog.csdn.net/plain_maple/article/details/53426867