2013-11-10 2 views
-1

Хорошо, поэтому ... Мне нужно проверить, является ли массив полной цепочкой. Я покажу вам, что это означает:цикл для каждого элемента массива?

У меня есть arr [5, 3, 2, 0, 4, 1]. N (размер массива) = 6, N-1 = 5. Таким образом, массив должен содержать числа 0-5. Затем мы начинаем с arr [0].

arr [0] = 5, поэтому переходим к arr [5] = 1, arr [1] = 3, arr [3] = 0, что возвращает нас к arr [0].

Поскольку этот массив не попал в КАЖДОЕ число, это не полная цепочка. Надеюсь, это имеет смысл.

Я должен написать метод в java, который начинается с arr [0], и проходит, как я сказал, и если он попадает в каждое число в массиве, он является полной цепочкой (true). Если он когда-либо возвращается к числу, которое уже ударил, это не (false).

Я понимаю логику этого ... Я просто не могу его реализовать. Я не понимаю, как использовать цикл для отслеживания чисел и индексов ... (мы должны использовать циклы).

Может ли кто-нибудь помочь указать мне в правильном направлении? Я не ищу код, но если бы кто-то мог объяснить, как я мог бы реализовать цикл с этим, это было бы потрясающе!

+0

«но если кто-то может объяснить, как я мог бы реализовать цикл», возможно, базовый учебник по java? –

+0

http://www.tutorialspoint.com/java/java_loop_control.htm – Evans

+0

Вы попросили своего тренера/преподавателя/профессора? –

ответ

0

Вы можете использовать цикл for для итерации в массиве. Вот пример:

int[] array = new int[4]; 
array[0] = 2; 
array[1] = 5; 
array[2] = 1; 
array[3] = 8; 

for(int i = 0; i<array.length; i++){ 
    System.out.println("The element in the array at position: "+ i +" is: " + array[i]); 
} 

Как вы можете видеть, я заявляю и инициализировать массив первым. В цикле for сначала объявляю и инициализирую временную переменную (эта переменная будет удаляться при завершении цикла for) до 0 (int i = 0). Затем я пишу выражение конца для цикла «for» (i < array.length), это выражение определяет, когда for будет идти до конца, в этом случае цикл for будет работать до тех пор, пока «i» не станет меньше массива .length (4). Затем я увеличу временную переменную на один (i ++).

Тело цикла for в этом случае прост (напечатайте элемент массива в данной позиции (i)). Но это может быть то, что вы хотите делать с массивом.

Я надеюсь, что вы можете понять.

PS: Извините за мой английский. Мой первый язык - испанский. : D

+0

java массивы имеют атрибут длины, а не метод. Поэтому вы действительно захотите использовать 'array.length' вместо' array.length() ' –

+0

upss! Да, прости. Это то, что я использую только List, list.size(): D –

-1

Я опишу метод, который возвращает значение в указанном местоположении индекса, заданном массивом из int.

public static int getAtPosition(int nextPosition, int... elements) { 
    return elements[nextPosition]; 
} 

В сущности, любое значение, я использую для nextPosition используется в качестве индекса в массиве.

Рассмотрим следующий, вы высев вашего nextPosition с помощью arr[0] для начала, что, если в сочетании с вызовом метода, приводит к следующему значению позиционного 1.

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

Теперь трюк здесь - это выбор структуры данных для хранения элементов, которые мы видели, и для предотвращения повторного запуска дублирования. Для этого воспользуемся Set<Integer>, так как мы можем add относительно дешево, а интерфейс для Set обязывает, что он возвращает true тогда и только тогда, когда этот элемент не был добавлен в предыдущий набор.

public static boolean invalidChain(Set<Integer> values, int index) { 
    return !values.add(index); 
} 

Объяснение:

  • Учитывая множество целых чисел, добавить позицию индекса, который я только видел.
  • Если позиция индекса была успешно добавлена, я возвращаю false - потому что успешный add() подразумевает, что значение никогда не помещалось в набор.
  • Если позиция индекса не была успешно добавлена, я возвращаю true - по той же причине, что и выше.

Учитывая все это, вы теперь автор цикла, которая использует логическое invalidChain, и INT getAtPosition. Подсказка: invalidChain - это только Условие, которое вы должны проверить в цикле.

0

Вы хотите иметь счетчик (инициализированный до 0) для элемента, который выпадает из вашей цепочки. Вам также нужен массив типа boolean, который имеет одинаковый размер вашего массива. Этот булев тип массива должен отслеживать, есть ли у вас дубликаты элементов.

Чтобы ускорить выполнение программы в своем for-loop (для итерации вашего массива), когда вы найдете элемент, который выпадает из вашего диапазона цепей, вы увеличиваете счетчик и выходите из цикла. После этого вы просто проверяете, является ли счетчик == 0. Если это 0, ваша цепочка завершена, в противном случае - неполной. Надеюсь, это поможет.

Как проверить, находится ли элемент вне диапазона? проверьте, является ли элемент> = array.length или < 0 (если я правильно понимаю вашу проблему)

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

int[] arrayToCheck = new int[]{5, 3, 2, 0, 1, 1}; 
boolean[] arrayMarker = new boolean[arrayToCheck.length]; 

int count = 0; // count the number out of the chain 

for (int i : arrayToCheck) { 
    // here you need to write code to check the element i is within 
    // your range, if not, increment counter, break out 

    if (arrayMarker[i] != true) { 
     arrayMarker[i] = true; 
    } else { 
     count++; 
     break; 
    } 
} 

boolean completeChain = (count == 0) ? true : false; 
System.out.println("is completeChain: " + completeChain); 
0

предполагающие номера являются уникальными:

public int sum(int[] arr) { 
    int ret = 0; 
    for (int i : arr) { 
     ret += arr[i]; 
    } 
    return ret; 
} 

int[] arr = { 5, 3, 2, 0, 4, 1 }; 
int tmp = arr[0]; 
int sum = 0; 
for (int i = 0; i < arr.length; i++) { 
    sum += arr[tmp]; 
    tmp = arr[tmp]; 
} 
System.out.println(sum == sum(arr)); 
2

Я хотел бы использовать вспомогательную boolean[], чтобы сказать нам, если мы попали в индекс а второй раз. Поскольку вам явно нужно иметь способ сохранить элементы, которые вы уже видели, и так как эта структура в любом случае займет линейное пространство в худшем случае, вы также можете использовать это. Я хотел бы сделать это таким образом

public static boolean arrayIsCompleteChain(int[] array) { 
    boolean[] visited = new boolean[array.length]; 
    int index = 0; 
    int steps = 0; 

    // stop once we visit an index twice 
    while(!visited[index]) { 
     visited[index] = true; // mark index as visited 
     index = array[index]; // go to the next index 
     steps++;    // count this step 
    } 

    // if we made one step for every index, then the array is a complete chain 
    if(steps == array.length) { 
     return true; 
    } else { 
     return false; 
    } 

    // for anyone reading this who thinks to himself the "if" construct is 
    // unnecessary: this is for didactic purposes 
} 

Обратите внимание, что этот метод не выполняет никакой проверки проверки на входе, то есть содержит ли он элементы, которые поставили бы индекс вне границ, или массив сам по себе является null. Если вы этого хотите, это довольно легко сделать.

Смежные вопросы