Образец теста приманки Вопрос о нечетных числах

Итак, на сайте 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, но он не показывает тестовые примеры, которые не прошли.

Мне просто интересно узнать о тестовых примерах, в которых это не удается, потому что я не могу этого понять.

При каких обстоятельствах этот код не сможет выполнить то, что он намеревался сделать?

Спасибо.

Я не знаю этих тестов, но ваш цикл кажется странным. Почему не только for( int i=l; i<=r; i++) { /*test here*/ }?

Thomas 10.12.2018 13:40

Рассмотрим, что на самом деле означает выражение l+i%2 (с учетом приоритета операторов)

Henry 10.12.2018 13:40

считать l = r = 2 - выйдет из строя ...

Leonardo Alves Machado 10.12.2018 13:44

У вас нет подтверждения на ограничение 1 <= l <= r <= 10^5? Может быть, у них тоже есть тесты на это?

Amongalen 10.12.2018 13:51

@Amongalen В этих задачах (например, хакер) ограничения не нужно проверять. Это предположения о входах проблемы.

Leonardo Alves Machado 10.12.2018 13:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
216
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Необязательно применять %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);
}
Ответ принят как подходящий

У вас две ошибки:

  1. (l + i % 2): сначала вычислит i % 2, а затем добавит его в l, что неверно
  2. 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 минут.

user10285737 10.12.2018 14:37

Другие вопросы по теме