给定一个非负整数N
,找出小于或等于N
的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。当且仅当每个相邻位数上的数字x
和y
满足x <= y
时,我们称这个整数是单调递增的。
整体思路就是将数字当作字符串,从尾到头逆向遍历一遍,每次比较两位,如果后一个位置上的数小于前一个位置上的数,那么就将前边的数减一,并将后边的所有位都变为9
,例如当我们遍历到了1323
中比较32
的这个位置上,此时3 > 2
符合条件,那么我们就将3
减一并将其后的数都变作9
,即将其变为1299
,直到遍历到头即可。通常来说可以把数字作为字符串来遍历处理,上面的题解是使用纯数字的方式去做,首先定义i
作为标记记录遍历到到的位置,之后定义num
作为待处理的数字,定义循环只要能够继续取出两位数就继续循环,这是循环的终止条件,此外能够使用乘法的地方就尽量不要使用除法,在js
中int32
如果不能够整除则会自动转双精度64
,所以在很多地方都需要强制转数值为int32
,之后取出两位数,这里~~
是使用位运算强制转了整型,在之后将i * 10
定义到下一位,如果低一位上的值大于大于高一位上的值,那么就将数值在第i
位以后的值都变成0
,然后减1
即可达到上述的将此位减1
以及之后的数字都变为9
,可以参考上边的示例,在循环结束后返回处理的数字即可。