LintCode 1174. 下一個更大的元素 III JavaScript演演算法

2020-09-19 12:04:09

描述

給定一個32位元整數n,用同樣的數位組成新的32位元整數,使得它要比n大,返回最小的這樣的數。如果不存在這樣的整數,返回-1。

樣例

- 樣例 1:

輸入: 12
輸出: 21

- 樣例 2:

輸入: 21
輸出: -1

解析

nextGreaterElement = function (n) {
    function check(source, sort){
        for(let i = 0; i < source.length; i++){
            if(source[i] != sort[i]){
                return true;
            }
        }
        return false;
    }
    function buildString(str){
        let strArray = str.split(''),
            firstChar = strArray.shift(),
            sortArray = [...strArray].sort((a, b)=> a > b ? -1 : 1),
            res = '';
        if(!check(strArray, sortArray)){
            for(let i = 0; i <= sortArray.length; i++){
                if(sortArray[i] <= firstChar || i == sortArray.length){
                    res += sortArray[i - 1];
                    sortArray.splice(i - 1, 1, firstChar);
                    break;
                }
            }
            sortArray.sort((a, b)=> a > b ? 1 : -1);
            return res + sortArray.join('');
        }
        return firstChar + buildString(strArray.join(''));
    }

    let nToString = n.toString().split(''),
        sortSet = [...nToString].sort((a, b)=> a > b ? -1 : 1);
    if(check(nToString, sortSet)){
        let num = buildString(nToString.join('')) - 0;
        return num > Math.pow(2, 31) - 1 ? -1 : num;
    }
    return -1;
}


執行結果

在這裡插入圖片描述