Найдите максимальное число, образованное перестановкой цифр одинаковой четности

Опубликовано: 19 Сентября, 2022

Учитывая число N, задача состоит в том, чтобы максимизировать это число, выполняя заданные условия:

  • Нечетная цифра числа может быть заменена только любой нечетной цифрой, присутствующей в данном числе.
  • Четная цифра числа может быть заменена только любой четной цифрой, присутствующей в данном числе.

Примеры:

Input: N = 234
Output: 432
Explanation: The 0th index is swapped with 2nd index.

Input: N = 6587
Output: 8765
Explanation: The 0th index is swapped with 2nd index.
The 1st index is swapped with 3rd index.

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

Следуйте шагам, указанным ниже, чтобы реализовать идею:

  • Преобразуйте данное число N в строку s (это упростит обход каждой цифры числа)
  • Итерировать строку от 0 до s.length()-1 :
    • Используйте переменные для хранения максимального значения справа от текущего индекса (скажем, maxi ) и его позиции (скажем, idx ).
    • Перебрать строку от j = i+1 до s.length()-1
      • Если и i -я, и j -я цифры имеют одинаковую четность , а j -я цифра больше, чем i -я, тогда обновите maxi и idx .
      • В противном случае продолжайте итерацию.
    • Наконец, поменяйте s[i] на s[idx]
  • Возвращает целочисленное значение строки s .

Ниже приведена реализация описанного выше подхода.

Сложность времени: O(N 2 ), где N — длина заданной строки.
Вспомогательное пространство: НА)

Эффективный подход: эта проблема может быть эффективно решена на основе следующей идеи:

Store all even digits in non-increasing order and do the same for odd digits. 
Now replace all stored even digits of given number in non-increasing order with even digits in it and do the same for odd digits.

Следуйте шагам, указанным ниже, чтобы реализовать идею.

  • Преобразовать данное число N в строку s .
  • Переберите s и сделайте следующее:
    • Сохраните все четные цифры в строке (скажем, evenDigit ) и все нечетные цифры в другой строке (скажем, oddDigit ).
    • Отсортируйте обе строки в порядке невозрастания.
  • Переберите s и сделайте следующее:
    • Используйте два итератора (скажем, itr1 и itr2 ), чтобы указать на следующую четную или нечетную цифру, которую нужно выбрать.
    • Если цифра в s четная, замените ее цифрой в evenDigit[itr1] и увеличьте itr1.
    • Если цифра в s нечетная, то замените ее цифрой вodDigit[itr2] и увеличьте itr2.
  • Наконец, преобразуйте строку s в целое число и верните ее.

Ниже приведена реализация описанного выше подхода.

Сложность времени: O(M * log M), где M — количество цифр в N.
Вспомогательное пространство: О(М)