Вопрос:

Create a function that takes a positive integer and returns the next bigger number that can be formed by rearranging its digits. For example: 12 ==> 21 513 ==> 531 2017 ==> 2071 If the digits can't be rearranged to form a bigger number, return -1 (or nil in Swift, None in Rust): 9 ==> -1 111 ==> -1 531 ==> -1 export function nextBigger(n: number): number { тут код }

Ответ ассистента

Привет! Сейчас помогу тебе написать функцию, которая находит следующее большее число, образованное перестановкой цифр заданного числа.

```typescript export function nextBigger(n: number): number { // 1. Преобразуем число в массив цифр. const digits = String(n).split('').map(Number); const len = digits.length;

// 2. Находим первую цифру справа, которая меньше предыдущей. let i = len - 2; while (i >= 0 && digits[i] >= digits[i + 1]) { i--; }

// 3. Если такой цифры нет, значит, перестановка невозможна. if (i < 0) { return -1; }

// 4. Находим наименьшую цифру справа от digits[i], которая больше digits[i]. let j = len - 1; while (digits[j] <= digits[i]) { j--; }

// 5. Меняем местами digits[i] и digits[j]. [digits[i], digits[j]] = [digits[j], digits[i]];

// 6. Сортируем часть массива справа от digits[i] в порядке возрастания. const rightPart = digits.splice(i + 1).sort((a, b) => a - b);

// 7. Соединяем все части обратно и преобразуем в число. const result = Number(digits.concat(rightPart).join(''));

return result; } ```

Как это работает:

  1. Преобразование в массив цифр: Сначала мы преобразуем исходное число n в массив отдельных цифр. Это нужно, чтобы было удобно манипулировать цифрами.
  2. Поиск "точки перегиба": Мы ищем первую цифру справа, которая меньше, чем цифра справа от неё. Это место, где можно сделать перестановку, чтобы получить большее число. Если такой цифры нет, это значит, что все цифры идут в порядке убывания (или одинаковые), и следующее большее число получить нельзя.
  3. Поиск подходящей цифры для обмена: Мы ищем наименьшую цифру справа от найденной "точки перегиба", которая больше, чем цифра в "точке перегиба".
  4. Обмен и сортировка: Меняем местами найденные цифры и сортируем все цифры справа от "точки перегиба" в порядке возрастания. Это гарантирует, что мы получим следующее большее число.
  5. Соединение и результат: Соединяем все части массива обратно в число и возвращаем его.

Пример:

Пусть n = 513.

  1. digits = [5, 1, 3]
  2. i = 1 (потому что 1 < 3)
  3. j = 2 (потому что 3 > 1)
  4. После обмена: digits = [5, 3, 1]
  5. Сортируем [1] -> [1]
  6. Результат: 531

Другие решения

Что ещё задавали пользователи