Leetcode 556. Next Greater Element III javascript解决方案

396 阅读1分钟

题意: 把一个正整数 各个位上的数任意换序,给出最小的大于原数的值,并且数值要小于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;
};