参考:https://www.geeksforgeeks.org/find-next-greater-number-set-digits/
const given_number = 320235484882472;
// 大脑理解就是4变成6然后+479(4、7、9组合成的最小数字)
// 算法理解就是从右到左找,找到第一个可以被替换的数字->4。
// 7>6,7不行。9>7,9不行。4<9,4可以
// 找到[9,7,6]里面最小的数字6
// 交换4和6。就固定好了最高位536
// 剩下的数字排序,结果就是最小的数字479
const nextBigger=(number)=>{
const arr=(number+'').split('').map((item)=>Number(item));
const len=arr.length;
const tempArr=[];
const map={};
const result=[];
// 从右到左,找到需要被交换的数字
for(var i=len-1;i>=0;i--){
tempArr.push(arr[i]);
if((i!=len-1)&&(arr[i]<arr[i+1])){
map.replacedNum=arr[i];
map.replacedIndex=i;
break;
}
}
if(map.replacedNum===undefined){
return -1
}
// 找到和他交换的大数字,通过计算得到这个数字在原数组中的index
tempArr.pop();
tempArr.reverse();
map.biggerNum=tempArr[0];
tempArr.forEach((item,index)=>{
if((item>map.replacedNum)&&(item <= map.biggerNum)){
map.biggerNum=item;
map.biggerNumIndex=index;
}
});
map.biggerNumIndex= map.biggerNumIndex+map.replacedIndex+1;
console.log(tempArr)
// 交换
arr.forEach((item,index)=>{
if(index===map.replacedIndex){
result.push(map.biggerNum);
}else if(index===map.biggerNumIndex){
result.push(map.replacedNum);
}else{
result.push(item)
}
});
arr.splice(map.biggerNumIndex,1,map.replacedNum)
// replacedIndex之后的数字全部重新排序,排成最小的数字就行
const newNumArr=arr.slice(map.replacedIndex+1).sort();
result.splice(map.replacedIndex+1);
return Number(result.concat(newNumArr).join(''));
}
const res=nextBigger(given_number);
console.log(res)