携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>
单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例1:
输入: n = 10
输出: 9
示例2:
输入: n = 1234
输出: 1234
实例3:
输入: n = 332
输出: 299
提示:
0 <= n <= 109
解题思路:
由于n的范围最大的是10的9次幂,所以可以用位数来计算,这样就算循环也只循环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)
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )