Сортировать все четные числа в порядке возрастания, а затем отсортировать все нечетные числа в порядке убывания в коллекции. - PullRequest
6 голосов
/ 08 февраля 2012

Это вопрос интервью.

Есть несколько случайных чисел (скажем, в массиве целых чисел).

  1. Как мы можем сначала отсортировать все четные числа в порядке возрастания, а затем отсортировать все нечетные числа в порядке убывания.
  2. Какая коллекция подходит лучше всего.

Ввод чисел:

12 67 1 34 9 78 6 31

Вывод сохранен в коллекции:

6 12 34 78 67 31 9 1 

Ответы [ 13 ]

0 голосов
/ 08 февраля 2012

Вы можете использовать одну структуру данных, которая содержит все числа, а затем создать два SortedSet s, один для нечетного и один для четного.Сортированный набор может принимать Comparator в качестве параметра, который позволяет сортировать элементы при вводе данных.

После того, как вы пройдете все числа, создайте новую коллекцию, которая объединит два отсортированных набора..

Вы также можете заменить отсортированные наборы, используя два Lists.После того, как вы добавили все номера, наберите Collections.sort() в списках, а затем объединитесь, как и раньше.

0 голосов
/ 08 февраля 2012

Если все числа положительные, вы можете умножить нечетные числа на «-1», выполнить стандартную сортировку, а затем снова умножить все нечетные числа на «-1».

Если вы хотите, чтобы порядок соответствовал вопросу, вам также придется поменять местами «отрицательные» и «положительные» части массива до 2-го умножения.

Всего накладных расходов: еще 3 цикла в дополнение к выбранному алгоритму сортировки.

List<Integer> numbers = new ArrayList<Integer>();
//add some numbers here
//12 67 1 34 9 78 6 31 <-- in the list
for (int i = 0; i < numbers.size(); i++) {
    if (numbers.get(i) % 2 == 1) {
       numbers.set(i, numbers.get(i) * (-1));
    }
}
//12 -67 -1 34 -9 78 6 -31 <-- before sort
sort(numbers);
//-67 -31 -9 -1 6 12 34 78 <-- after sort
swapNegativeAndPositiveParts(numbers);
//6 12 34 78 -67 -31 -9 -1 <-- after swap
for (int i = 0; i < numbers.size(); i++) {
    if (numbers.get(i) % 2 == 1) {
       numbers.set(i, numbers.get(i) * (-1));
    }
}
//6 12 34 78 67 31 9 1  <-- after second multiplication
0 голосов
/ 08 февраля 2012

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

Что я хотел бы сделать, так это то, что в моем вызове Collection.sort я бы проверил, равно ли число mod 2 (number%2) нулю, тогда я бы сделал простое compareTo, иначе я бы сделал Integer.MAX_INT - oddNumber, а затем сделать сравнение.Таким образом, чем больше нечетное число, тем меньше сгенерированное число, и оно будет отсортировано в конец списка в порядке убывания.

Integer num1 = (o1%2 == 0)? new Integer(o1) : new Integer(Integer.MAX_INT - o1);
Integer num2 = (o2%2 == 0)? new Integer(o2) : new Integer(Integer.MAX_INT - o2);
return num1.compareTo(num2);

Выше приведен только код sudo, не воспринимайте его слишком буквальноЭто просто, чтобы дать вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...