Итак, на сайте Honeypot есть общедоступный образец теста, и я не совсем понимаю один из тестов.
1 <= l <= r <= 10^5
л - начальный номер
г - конечный номер
Тест должен вернуть все нечетные числа между 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;
Этот код прошел 8 из 12 тестовых случаев, он не прошел тесты 7-10, но он не показывает тестовые примеры, которые не прошли.
Мне просто интересно узнать о тестовых примерах, в которых это не удается, потому что я не могу этого понять.
При каких обстоятельствах этот код не сможет выполнить то, что он намеревался сделать?
Спасибо.
Рассмотрим, что на самом деле означает выражение l+i%2 (с учетом приоритета операторов)
считать l = r = 2 - выйдет из строя ...
У вас нет подтверждения на ограничение 1 <= l <= r <= 10^5? Может быть, у них тоже есть тесты на это?
@Amongalen В этих задачах (например, хакер) ограничения не нужно проверять. Это предположения о входах проблемы.




Необязательно применять %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;
Если диапазон начинается после 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);
}
У вас две ошибки:
(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);
}
Спасибо. Я не понимал, что (l + i% 2) сначала вычислит i% 2 и добавит l только ПОСЛЕ. Я кодил всего 2 месяца, и у меня было 10 минут, чтобы решить эту проблему. Это лучшее, что я мог придумать за 10 минут.
Я не знаю этих тестов, но ваш цикл кажется странным. Почему не только
for( int i=l; i<=r; i++) { /*test here*/ }?