738. 单调递增的数字(贪心)

题目

738. 单调递增的数字

思路

  1. 假如后一个数字比前一个小,那前一个就得减一,然后后一个就得变成9,比如76,得变成69
  2. 从后往前遍历(不然需要不断的重新更新),比如321,比较n[0]和n[1]后变成了291,比较n[1], n[2]然后219,2又比1大
  3. 注意类似于100这样的例子,如果只靠上述的逻辑处理完是90,因为0 === 0所以第二个零没有变,这时需要一个记录最早的9位置的tag

代码

/**
 * @param {number} n
 * @return {number}
 */
var monotoneIncreasingDigits = function(n) {
    let val = String(n).split('').map(item => +item);
    let tag = Infinity;
    //非常重要的一步!适用于本来i - 1 <= i,但是由于i - 2 > i - 1而把i - 1变成9
    if(val.length === 1) return n;
    for(let i = val.length - 1; i > 0; i--){
        if(val[i - 1] > val[i]){
            val[i - 1] -= 1;
            val[i] = 9;
            tag = i;
        }
    }
    //把最先变成9位置的所有后续数字全换成9
    for(let i = tag; i < val.length;i++){
        val[i] = 9;
    }
    return + val.join("") ;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值