算法第四章实践报告 | 实践题解

算法第四章实践报告

一、实践题目: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-17-3较水,具有明显的贪心选择。个人感觉其实在做题的时候还需要严格证明一下贪心算法的正确性。

 

六、参考链接

1.https://blog.csdn.net/plain_maple/article/details/53426867

2.https://www.cnblogs.com/xiaoying1245970347/p/4630399.html

转载于:https://www.cnblogs.com/ljl-gd/p/10036695.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值