蜜 jar 样品测试奇数问题

因此,在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)

2 years ago

如果范围在 1 之后开始(即 l > 1 ), (l + i % 2) == 1 ,其被评估为 (l + (i % 2)) == 1false . (l + (i % 2)) == 1 只有 l == 1i 是偶数才能为真 .

你应该使用的是 ((l + i) % 2) == 1 .

此外,循环的条件应该是:

i < r-l+1

请注意,如果您只是将 il 迭代到 r ,那么您的代码可以更具可读性(并且更不容易出错):

for (int i=l; i<=r; i++){
    if((i%2)==1)
        arraylist.add(i);
}

2 years ago

你有两个错误:

  • (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);
}

2 years ago

您不必在每个号码上应用 %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;