因此,Honeypot网站上公开提供了一个样本测试,我对其中的一种测试感到困惑。
1 <= l <= r <= 10 ^ 5
l是起始号码
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个测试用例中未通过,但未显示失败的测试用例。
我只是对失败的测试案例感到好奇,因为我似乎无法弄清楚。
在什么情况下此代码将无法完成其预定的工作?
谢谢。
答案 0 :(得分:2)
如果范围开始于w_data
(即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
答案 1 :(得分:1)
您不必对每个数字都应用%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;
答案 2 :(得分:0)
您有两个错误:
(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);
}