软件构造Lab4_Debug

一、理解待调试程序的代码思想

1.FindMedianSortedArrays
此函数为给定两个已排好顺序的数组,找到这两个数组的中位数。
先把A和B中较长的数组赋给B,然后在数值比较中标记逐渐指向中间,最终找到maxLeft和minRight两个值。若m+n为奇数,则直接返回maxLeft,若为偶数则返回(maxLeft+minRight)/2.0。

2.RemoveComments
此函数为删掉代码中的注释,定义一个布尔型变量inBlock,如果遇见/则变为真,不记录之后的内容,遇见/,变为假,再开始记录之后的内容。需要判断什么时候遇见//。

3.TopVotedCandidate
此函数功能为找出最佳选举人,先给定两个数组,一个为选举投票的人的数组,一个为选举这些人时的时间的数组。建立一个双层list的列表,构造方法为按照数量建立外层list,内层list为投票数为此的人的顺序。因此外层list得到的序列的第0个元素的时间是有序的。内层list的时间也是有序的。q方法为找出最佳选举人,按照双层list的构造特点,进行两层二分查找。最终找到结果。

二、发现并定位错误的过程

1…FindMedianSortedArrays
此函数共有两处错误。一处是定义halfLen时,当m+n为奇数时,halfLen指向的是中间的前一位。另一处是返回maxLeft时,错误之处是当m+n为偶数的时候返回maxLeft,应为奇数返回。

2.RemoveComments
在找//的过程中,没有进行判断,会多次出现下表越界。并且没有判断遇见//的情况。最后输入的时候只要inBlock为false就应该输入,而不是用else if来判断这个条件。

3.TopVotedCandidate
在构造A的时候出现错误,按照原始代码,只会在A.get(1)中加入投票。
其次是两次二分查找,A的范围是1到A.size()-1,A.get(i)的范围是0到A.get(i).size()-1,并且两次二分查找需要考虑找到的值小于给定的t。

三、如何修正错误

1.FindMedianSortedArrays
一是将halfLen改为(m+n+1)/2:若m+n为奇数,halfLen为(m+n)/2+1,即中间的数,若m+n为偶数,halfLen为(m+n)/2,即中间偏左一位的数。
二是返回maxLeft时的条件改为(m + n) % 2 == 1:m+n为奇数时,直接找中位数,为偶数时需要取平均值。

2.RemoveComments
在找/的时候,先发现/,在判断有没有下一位,若有则判断是否是,若是则定义inblock为true。在找*/时,先找/,在判断有没有上一位,若有则判断是否是*,若是则定义inBlock为false。增加找//,先找先发现/,在判断有没有下一位,若有则判断是否是/,若是这一行的后面都不读。

3.TopVotedCandidate
在构造A时,按照计数构造,因此将c改为count.getOrDefault(p, 0)+1。
其次是两次二分查找,外层:lo = 1, hi = A.size()-1,内层:lo = 0,hi = A.get(i).size()-1。并在二分查找时考虑找到的值小于给定的t的情况。
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值