题意: 把一个正整数 各个位上的数任意换序,给出最小的大于原数的值,并且数值要小于32位,否则返回-1。
思路:
1、先找出已经是最大数的可能。
把原数字split打散成数组,sort一下,从大到小,再join拼回来,跟原数值比较,一样大的话,直接返回-1。
2、如果能走到这一步,说明肯定存在比原数更大的组合的数值存在。
从最后一位开始,前后2位比对,找到第一个后面数值比前面一个大的,记录前一个的index,把原数组,分成 [ 0 ~ index - 1 ], [ index, length - 1 ] 2段。直接对后一段进行处理。
把第二段从小到大排序,拉出lastIndexOf 临界值,
取到 lastIndex + 1,就是仅大于临界值的值,
把这个仅大于值从第2段数组切下来,行程独立的第三段。
按第三段、第一段、第二段 的顺序拼接好,就是我们要的值 answer 了。
3、判断answer是不是比最大的32位数值要大。
因为32位,第一位要留下来记录正负。所以32位是 2 ^ 31 - 1 = 2147483647。
answer大于该临界值,返回-1。否则返回answer。
结束。
上代码:
/**
* @param {number} n
* @return {number}
*/
var nextGreaterElement = function(n) {
let list = (n + '').split('');
list.sort((b, a) => parseInt(a) - parseInt(b));
if(n + '' === list.join('')){
return -1;
}
let l = (n + '').split('');
let index = -1;
for(let i = l.length - 2; i >= 0; --i){
if(l[i] < l[i + 1]){
index = i;
break;
}
}
let key = l[index];
let sub = l.splice(index);
sub.sort((a, b) => parseInt(a) - parseInt(b));
let ind = sub.lastIndexOf(key) + 1;
l.push(sub[ind]);
sub.splice(ind, 1);
l.push(...sub);
let res = parseInt(l.join(''));
let max = 2147483647;
return res < max ? res : -1;
};
