Позиция индекса наименьшего числа в массиве

#java

#java

Вопрос:

У меня есть вопрос о возврате позиции индекса наименьшего числа в массиве. Я выбрал 3 ответа из 5, которые я предоставил ниже. Я думаю, что один из них может быть правильным. Однако я не очень хорошо понимаю код, поэтому я ищу объяснение, как они работают.

A

 public int min(int[] a) {
    int min = 0;
    for (int i = 1; i < a.length; i  ) {
        if (a[i] <  a[min]) {
            min = i;
        }
    }
    return a[i];
}
  

B

 public int min(int[] a) {
    int min = 0;
    for (int i = 1; i < a.length; i  ) {
        if (a[i] <  a[min]) {
            min = i;
        }
    }
    return i;
}
  

C

 public int min(int[] a) {
    int min = 0;
    for (int i = 1; i < a.length; i  ) {
        if (a[i] <  a[min]) {
            min = i;
        }
    }
    return min;
}
  

Комментарии:

1. «Я предоставил 3 ответа ниже, которые, я думаю, они, возможно, верны» и почему они должны быть верными? Первые два даже не компилируются правильно (за исключением очевидной , опечатки в int i = 1; i < a.length, i ). И то, что они делают, можно легко протестировать. Вы пробовали их тестировать?

2. Нет, у меня нет. Я только пытался отследить код, чтобы понять код. Я не могу понять код, поэтому мне нужна помощь

3. попробуйте запустить код с помощью инструкций print или используйте debugger, чтобы увидеть, что происходит.

4. Итак, я отредактировал вопрос. Эти 3 решения выше, я выбрал их из комбинации 5 решений, которые, как я думаю, могут быть верными, а могут и не быть, на мой взгляд.

5. Суть обучения программированию заключается в развитии того любопытства, которое заставляет вас пробовать что-то самостоятельно. Будьте готовы сесть и проводить эксперименты часами. В долгосрочной перспективе запрос объяснений, подобных тому, что вы делаете здесь, замедляет работу. Вместо этого: запустите свой код. Придумайте примеры массивов, затем попытайтесь мысленно «выполнить» каждый метод на листе бумаги. Затем запустите его и используйте операторы печати для просмотра промежуточных результатов. Не просите объяснений, когда можете легко найти ответы самостоятельно.

Ответ №1:

Это довольно просто.. вы ищете наименьший индекс. Представьте, что массив a состоит из 3 элементов.

A

 public int min(int[] a) {
    int min = 0;
    for (int i = 1; i < a.length, i  ) {
        if (a[i] <  a[min]) {
            min = i;
        }
    }
    return a[i];    //returning value. Wrong!
                    //you are searching for the index, not value isnt' it?
}
  

B

 public int min(int[] a) {
    int min = 0;
    for (int i = 1; i < a.length, i  ) {
        if (a[i] <  a[min]) {
            min = i;
        }
    }
    return i;    //returning i which only exist in for-loop scope. Wrong!
}
  

C

 public int min(int[] a) {                   //assume a has 3 elements
    int min = 0;                            //for storing smallest index
    for (int i = 1; i < a.length, i  ) {    //loop index 1,2
        if (a[i] <  a[min]) {               //if current array value < current smallest value
            min = i;                        //store new found smallest index
        }
    }
    return min;                             //returning min, the smallest index 
}
  

Если min не обновляется с помощью цикла, это означает, что индекс 0 (значение по умолчанию min) содержит наименьшее значение. Вариант C будет правильным ответом.

Комментарии:

1. Ваше замечание относительно AIOOBE неверно, имейте в виду, что условием прерывания является < , а не <= . Мне также интересно, почему вы правильно жалуетесь на выход за рамки i в коде B, но не в коде A?

2. Итак, вы думаете, что вместо i < a.length, i < = a.length было бы правильным ответом здесь?

3. @Nin Нет, i <= a.length неверно и вызовет упомянутое исключение user3437460.

4. @Tom В MCQ мы идем путем исключения неправильных ответов, поскольку вариант A либо i выходит за рамки цикла for, либо не возвращает индекс, мы исключим его как неправильный вариант. Для AIOOBE вы правы.

Ответ №2:

Первый код выдаст ошибку (исключение Index out of bound), потому что в конце цикла for ваш «i » будет равен длине массива, и вы возвращаете [i], поэтому это решение совершенно неверно. Второй код вернет длину массива, поэтому это также неправильное решение. Третий введенный вами код вернет индекс наименьшего значения. Итак, решение правильное.

Комментарии:

1. Не могли бы вы подробнее рассказать о первом коде? Почему он возвращает значение наименьшего индекса? Я хочу понять код, а не просто решение

2. О, прости, Том. Да, вы правы насчет первого кода. Я думал, что первый код возвращает [min]