1、题目描述
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1 :
输入: N = 10
输出: 9
示例 2 :
输入: N = 1234
输出: 1234
示例 3 :
输入: N = 332
输出: 299
2、题目分析
递增的数字是什么?前一位的要小于等于后一位的 当数字只有一位的时候,本身就是递增的数字 当数字是递增的时候,直接返回该数字 当数字是逆序的时候,进行操作,如何保证是最大的呢?观察可以看到,如果坐标i-1的值 < i的值,将i-1的值-1,i以及后边的值都换成 贪心思想 如何操作单个的int型数字的每位比较方便?转换成String类型再转换成数组类型进行操作,最后进行转型
3、代码实现
class Solution {
public int monotoneIncreasingDigits ( int N) {
char [ ] a = String. valueOf ( N) . toCharArray ( ) ;
if ( a. length < 2 ) return N;
for ( int i = a. length - 2 ; i >= 0 ; i-- ) {
if ( a[ i] - '0' > a[ i + 1 ] - '0' ) {
a[ i] = ( char ) ( a[ i] - '1' + '0' ) ;
for ( int j = i + 1 ; j < a. length; j++ ) {
a[ j] = '9' ;
}
}
}
return Integer. parseInt ( new String ( a) ) ;
}
}
赋值9可以优化一下,记录一下最前边的9的位置,下次只赋值到这个位置
4、复杂度分析
时间复杂度:O(logN) ,N是数字,其位数是logN 空间复杂度:O(logN),同上