因此,在Honeypot网站上公开了一个样本测试,我对其中一个测试感到困惑 .
1 <= 1 <= r <= 10 ^ 5
我是起始号码
r是结束号码
测试是返回l和r之间的所有奇数,包括l和r,如果它们恰好是奇数 .
这是我运行的函数中的代码,并期望整数的arraylist作为返回值:
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失败了,但它没有显示失败的测试用例 .
我只是对这个失败的测试用例感到好奇,因为我似乎无法弄明白 .
在什么样的环境中,这段代码无法按照它的目的去做?
谢谢 .
3 回答
如果范围在
1
之后开始(即l > 1
),(l + i % 2) == 1
,其被评估为(l + (i % 2)) == 1
是false
.(l + (i % 2)) == 1
只有l == 1
和i
是偶数才能为真 .你应该使用的是
((l + i) % 2) == 1
.此外,循环的条件应该是:
请注意,如果您只是将
i
从l
迭代到r
,那么您的代码可以更具可读性(并且更不容易出错):你有两个错误:
(l + i % 2)
:这将首先计算i % 2
然后将其添加到l
,这是错误的r - l + 2
:这应该改为r - l + 1
这将有助于您:
您不必在每个号码上应用
%2
. 试试以下: