UT7 Ответов: 2

Сделайте каждый индекс массива отрицательным в java


У меня есть этот код, чтобы найти наименьшее отсутствующее положительное значение в массиве. В методе findMissingPositive я не совсем понимаю, как индекс превращается в отрицательный, чтобы показать, что значение этого индекса было замечено раньше. Этот код взят из Найдите наименьшее положительное число, отсутствующее в несортированном массиве | Set 1 - GeeksforGeeks[^]

Это код для метода поиска наименьшего пропущенного положительного значения в несортированном массиве.
<pre>    
public static void main(String[] args) {  
      int [] arr = {4, 9, 11,  8, 67};
        
        System.out.println(findMissingPositive(arr, 5));
        
    }   
static int findMissingPositive(int [] arr, int size){
        int i;
        //Mark arr[i] as visited by making 
        // arr[arr[i] - 1] negative. Note that 
        // 1 is subtracted because index start from 0
        // and positive numbers starts from 1.
        
        for(i = 0; i < size; i++){
            int x = Math.abs(arr[i]);
            if(x - 1 < size && arr[x - 1] > 0)
                arr[x - 1] = -arr[x - 1];
        }
        
        // Return the first index value which
        // is positive
        for(i = 0; i < size; i++){
            if(arr[i] > 0){
                return i + 1; // 1 is added because indexes start from 0              
            }
        }   
        return size + 1;
    }


Что я уже пробовал:

Моя проблема заключается в тестировании первого цикла for для моего ввода int [] arr = {4, 9, 11, 8, 67};
Первая итерация первого цикла for должна быть - int x = Math.abs(arr[4]).
затем, if(4 - 1 < 5 && arr[4- 1] > 0) поскольку это верно, то первая итерация будет пройдена, и индекс 3 будет помечен отрицательно, но на второй итерации, int x = Math.abs(arr[9]).
Оператор if должен быть if(9 - 1 < 5 && arr[9 - 1]) поскольку это не сработает, почему его индекс будет помечен как отрицательный? Вот тут-то мне его и не хватает, спасибо за любую помощь.

Maciej Los

Какую часть заявления вы не понимаете?

// Mark arr[i] as visited by making arr[arr[i] - 1] negative. 
// Note that 1 is subtracted because index start 
// from 0 and positive numbers start from 1 

UT7

@Maciej, я все понимаю в комментариях. Моя проблема заключается в тестировании первого цикла for, чтобы увидеть, как работает каждая итерация. У меня возникли проблемы со второй итерацией. Спасибо.

2 Ответов

Рейтинг:
19

OriginalGriff

Это не "делает индекс отрицательным" - это "указывает" на другую часть памяти вообще!
Прочтите комментарии (и код) еще раз:

//Mark arr[i] as visited by making
// arr[arr[i] - 1] negative. Note that
// 1 is subtracted because index start from 0
// and positive numbers starts from 1.

arr[x - 1] = -arr[x - 1];
То, что они говорят, состоит в том, чтобы сделать значение при этом индексе отрицательное, а не пытаться изменить индекс!


UT7

Спасибо.

OriginalGriff

Всегда пожалуйста!

UT7

Всем привет, пожалуйста, не обижайтесь на мои вопросы. @OriginalGriff, @Maciej, я понимаю, что это значение в этом индексе, к которому будет добавлен отрицательный знак, но для 2-й, 3-й, 4-й и 5-й итераций первая часть оператора if должна потерпеть неудачу, как тогда значения в этих индексах будут превращены в отрицательные? Пожалуйста, покажи мне, что я упускаю.
2-я итерация в первом цикле for -
int x = Math. abs(arr[9])
если(9 - 1 < 5 && arr[9 - 1] > 0)
первое условие должно быть нарушено, как это значение будет превращено в отрицательное?
Извините за вопрос мой глупый вопрос, пожалуйста, помогите мне. Большое спасибо.

OriginalGriff

Я предлагаю вам запустить его в отладчике: вы можете проследить код до конца и посмотреть на значения переменных, чтобы точно узнать, что происходит. Вы сможете сами увидеть, что именно он делает и почему!

UT7

Ладно, сделаем. Спасибо

Рейтинг:
10

Patrice T

Цитата:
я не совсем понимаю, как индекс превращается в отрицательный, чтобы показать, что значение этого индекса было замечено раньше.

Индекс не изменяется, изменяется значение в позиции индекса.
Используйте отладчик, чтобы наблюдать за выполнением кода, это невероятный инструмент обучения.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


UT7

Спасибо.

Patrice T

всегда пожалуйста.