@New-Developer
Изучаю JavaScript

Следующее наименьшее число. Как упростить нахождение второго индекса?

Есть функция для нахождения следующего наименьшего числа.
function nextSmaller(n){
let forv=[...`${n}`].map(Number), rev=[...`${n}`].map(Number).reverse(),
idx1=rev.length-rev.findIndex((_,i,a)=>a[i-1]<a[i])-1,
idx2=forv.findIndex((v,i)=>Math.max(...forv.slice(idx1-forv.length+1)
.filter(x=>x<forv[idx1]))==v&&i>idx1);
[forv[idx1],forv[idx2]]=[forv[idx2],forv[idx1]];
let nn=Number([...forv.slice(0,idx1+1),...forv.slice(idx1-forv.length+1)
.sort((a,b)=>b-a)].join(''));
return rev.findIndex((_,i,a)=>a[i-1]<a[i])==-1||`${nn}`.length!=`${n}`.length?-1:nn}
console.log(nextSmaller(133232766512347))   //133232766475321

Справа находим индекс первой цифры, у которой есть меньшая цифра справа. Это idx1 //9
Потом находим индекс самой большой цифры, которая находится справа от idx1 и меньше нее. Это idx2 //13
Меняем местами эти цифры
Далее сортируем все цифры после индекса 9 в порядке убывания
Можно ли упростить нахождение idx2 ?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@dimoff66
Кратко о себе: Я есть
Ну естественно. По логике нахождения первого числа можно понять, что все числа после него идут в порядке возрастания, поэтому из реверса находите индекс первого числа которое меньше forv[idx1] и все. Естественно с экранированием на нормальный порядок.

По той же причине после перестановки сортировка чисел в обратном порядке не требуется, достаточно реверса.

К тому же forv тут вообще не нужен, достаточно rev

function nextSmaller(n){
  const rev = [...`${n}`].map(Number).reverse()
  const idx1 = rev.findIndex((v, i, a) => i && a[i-1] < v)

  if (idx1 < 0) return idx1

  const idx2 = rev.slice(0, idx1).findIndex(v => v < rev[idx1])
  if (idx2 < 0) return idx2;

  [rev[idx1], rev[idx2]] = [rev[idx2], rev[idx1]]
   
  const nn = +rev.slice(idx1).reverse().concat(rev.slice(0, idx1)).join('')
  return nn
}
  
console.log(nextSmaller(133232766512347)) //133232766475321
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Giperoglif
подозреваю что тут поможет бинарный поиск
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы