因此,在蜜罐网站上有一个公开的示例测试,我对其中一个测试感到困惑。
1 <= l <= r <= 10^5
我是起始号码
R是结束数
测试是返回l和r之间的所有奇数,包括l和r,如果它们恰好是奇数。
这是函数中的代码,它运行并期望数组整数列表作为返回值:
List<Integer> arraylist = new ArrayList<Integer>();
for (int i = 0; i < r - l + 2; i++) {
if ((l + i % 2) == 1)
arraylist.add(l + i);
}
return arraylist;这段代码通过了12个测试用例中的8个,失败的测试用例为7-10,但它没有显示它失败的测试用例。
我只是对这个失败的测试用例感到好奇,因为我似乎找不出答案。
在什么情况下,这段代码将无法完成它所设定的任务?
谢谢。
发布于 2018-12-10 12:46:52
你有两个错误:
(l + i % 2):这将首先计算i % 2,然后将其添加到l中,这是错误的r - l + 2:这应该更改为r - l + 1这将帮助你:
for (int i = 0; i < r - l + 1; i++) {
if (((l + i) % 2) == 1) arraylist.add(l + i);
}发布于 2018-12-10 12:43:42
您不必在每个数字上应用%2。试着在下面:
List<Integer> arraylist = new ArrayList<Integer>();
if(l % 2 == 0) l += 1;
for(int i=l; i<=r; i += 2){
arraylist.add(i);
}
return arraylist;发布于 2018-12-10 12:43:49
如果范围在1之后开始(即l > 1),则计算为(l + (i % 2)) == 1的(l + i % 2) == 1是false。(l + (i % 2)) == 1只有在l == 1和i是偶数的情况下才能成为真。
您应该使用的是((l + i) % 2) == 1。
此外,循环的条件应该是:
i < r-l+1请注意,如果您只需将i从l迭代到r,代码的可读性就会高得多(并且容易出错)。
for (int i=l; i<=r; i++){
if((i%2)==1)
arraylist.add(i);
}https://stackoverflow.com/questions/53705800
复制相似问题