软件构造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的情况。