Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача на массивы в Java.

Диана Суанова Ученик (111), закрыт 4 года назад
Дано натуральное число n и целочисленный массив из n чисел. Нужно изменить порядок следования элементов с нечётными значениями на обратный.
Лучший ответ
Дэнди Левихин Мастер (1720) 4 года назад
Держи, все объяснения в комментариях внутри исходников
Добра тебе ;)

import java.util.Scanner;

/**
* Дано натуральное число n и целочисленный массив из n чисел.
* Нужно изменить порядок следования элементов с нечётными значениями на обратный.
*/
public class ArrayTask {
public static void main(String[] args) {
/*Ввод данных с консоли*/
Scanner consoleInput = new Scanner(System.in);
System.out.print("Введите кол-во элементов массива: ");
int n = consoleInput.nextInt();
int array[] = new int[n];
for(int i = 0; i < n; i++){
System.out.printf("Введите %d-й элемент массива:", i+1);
array[i] = consoleInput.nextInt();
}

/*
* Основной алгоритм.
* Суть: Нам нужно, чтобы четные элементы найденные в начале, поменялись с таковыми,
* найденными в конце. Чтобы это сделать, создадим две "границы" - переменные a и b
* Теперь перебираем элементы от начала к концу. Как только находим первый нечетный -
* он становится нашей нижней границей уже отсортированного массива - границей a.
* Ниже а проверять ничего не нужно. Потом ищем в обратном порядке, с конца массива,
* где же будет верхняя граница - число b. Выше b тоже искать бессмысленно - туда помещаются
* уже отсортированные элементы. Таким образом мы идём от концов массива к середине:
* Допустим, есть массив [1 3 5 7]
* Тогда a = 1 и b = 7
* Меняем их местами, и получаем [7 3 5 1]
* Так как алгоритм не включает a и b в последующие проверки, теперь работаем с оставшимися по-центру
* элементами: 3 и 5. Их достаточно тоже поменять местами, чтобы получить [7 5 3 1] что от нас и требуется.
*/
for(int i = 0, a = 0, b = n; i < n; i++){
System.out.println("----------element#"+i+":"+array[i]+"----------");
if(Math.abs(array[i] % 2) == 1){
a = i;
for(int j = b-1; j > a; j--){
if(Math.abs(array[j] % 2) == 1){
b = j;
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println(array[a]+"<=>"+array[b]);
int temp = array[a];
array[a] = array[b];
array[b] = temp;
break;
}
}
}
}

/*Вывод результирующего массива*/
System.out.print("Результирующий массив: ");
for(int element: array) System.out.print(element);
System.out.println();
}
}

p.s. Если мыло сожрет часть специальных символов, или просто читать не удобно, можешь этот же код на пастебине посмотреть - я залил его туда с подсветкой синаксиса
pastebin. com/ w05rXQTR
(пробелы из ссылочки убрать, и не бояться - сайт страшенький, но вирусов нет - давно пользуюсь, очень удобно)
Остальные ответы
Александр Искусственный Интеллект (290690) 4 года назад
пусть не так изящно как в ответе описанном выше, но можно воспользоваться Stack
понадобится два прохода массива
в первом проходе, собираем туда все нечётные значения
во вроот проходе, заменяем каждый элемент содержащий нечётное значение следующим вынятым их стопки.
можно малость ускорить, запомнив индекцы первого и последнего элемента с нечётными величинами и второй проход делать только в этом диапазоне...
и первый проход можно проделать сразу во время ввода массива...
такой вокус в варианте в выше указанном ответе не получится... там надо знать весь массив до начала обработки...

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