描述
给一非负整数 N
, 找到小于等于 N 的最大的 单调递增数. (回想一下, 当且仅当每对相邻的数字 x 和 y 满足 x <= y 时, 这个整数才是单调递增数)
自己思路:自己写的比较丑陋,就不贴出来了,其实就是把所有情况判断出来,然后挑选符合条件的
dalao思路:要找到从后往前遍历的最后一个值升高的位置,让前一位减1,并把当前位以及后面的所有位都变成9,就可以得到最大的单调递增数啦。
就是找到第一个降序的相邻数位,因为这是借位的地方
这道题给了我们一个非负数,让我们求一个数字小于等于给定数字,且该数字各位上的数字是单调递增的。 那么我们就来分析题目中给的几个例子吧,首先如果是10的话,我们知道1大于0,所以不是单调自增的,那么返回的数就是9。 第二个例子是1234,各位上已经满足单调自增的条件了,返回原数即可。第三个例子是332,我们发现最后一位2小于之前的3, 那么此时我们将前面位减1,先变成322,再往前看,还是小于前面的3,那么我们再将前面位减1,就变成了222,此时222不是最大的单调递增数, 我们可以将后面两位变成9,于是乎就有了299,小于给定的332,符合题意。如果给定的数字是232,那么就会得到229,我们可以发现规律, 要找到从后往前遍历的最后一个值升高的位置,让前一位减1,并把当前位以及后面的所有位都变成9,就可以得到最大的单调递增数啦。
public int monotoneDigits2(int num) {// write your code hereString str=String.valueOf(num);char[] strArr=str.toCharArray();int n=str.length();int j=n;for(int i=n-1;i>0;i--){if(strArr[i]>strArr[i-1]){}else{strArr[i-1]--;j=i;}}for(int i=j;i<n;i++){strArr[i]='9';}if(strArr[0]=='0'){return Integer.parseInt(String.valueOf(strArr).substring(1,n));}return Integer.parseInt(String.valueOf(strArr));}
summary: 从前往后的规律比较复杂(我就是这样),不如从后往前找规律/最佳策略