LeetCode Everyday - 单调递增的数字

92 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>

单调递增的数字

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例1:

输入: n = 10
输出: 9

示例2:

输入: n = 1234
输出: 1234

实例3:

输入: n = 332
输出: 299

提示:

  • 0 <= n <= 109

解题思路:

由于n的范围最大的是109次幂,所以可以用位数来计算,这样就算循环也只循环10次
拆分数字n为数组,并且复制一个进行排序,然后判断两个是否相等,相等抛出
写递归函数,定义一个位数相同里面填充9 的数组,然后循环N的数组,只要判断前后位是递增的,就把当前位置替换给_temp,找到第一个前面小于后面的数,把前面的那个数自减1,替换给_temp的对应位置,然后直接跳出循环,再进行递归
当数组和排序后的数组相等时, 终结递归, 将结果返回

我的答案:

/**
 * @param {number} N
 * @return {number}
 */
var monotoneIncreasingDigits = function(n) {
    // 将数字装换成数组
    const nToArr = n.toString().split('')
    // 生命递归函数, 获取结果
    function fn(node){
        // 克隆实参, 并进行降序排序
        let cloneNode = [...node]
        cloneNode.sort(function(a,b){return a-b})
        let _temp = new Array(node.length).fill(9)

        if(parseInt(cloneNode.join('')) == parseInt(node.join(''))) {
            return parseInt(node.join(''))
        }
        // 循环位数判断两个位数是否相等
        for(var i = 0; i<node.length-1; i++){
            if(parseInt(node[i]) <= parseInt(node[i+1])){
                _temp.splice(i,1,parseInt(node[i]))
            }else{
                 _temp.splice(i,1,parseInt(node[i])-1)
                 break
            }
        }

        return fn(_temp)
    }

    return fn(nToArr)
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )