738. 单调递增的数字
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
提示:
0 <= n <= 109
-
//暴力法,分解数字--------->超时 class Solution {static bool check(int x){int maxnum=10;while(x){int t=x%10;if(maxnum>=t){maxnum=t;}else{return false;}x/=10;}return true;} public:int monotoneIncreasingDigits(int n) {for(int i=n;i>0;i--){if(check(i)){return i;}}return 0;} };
class Solution { public:int monotoneIncreasingDigits(int n) {//第一步将整数转成字符串,类似于高精度算法string str=to_string(n);//定义一个标志符flagbool flag=false;//如果高位大于次高位,直接高位减一,次高位变9,后面都变9//例如45357-->44999//但是例如332-->329,顾后不顾前,随意需要从后往前在遍历一遍for(int i=1;i<str.size();i++){//if(str[i-1]>str[i]&&flag==false){str[i-1]--;flag=true;}if(flag){str[i]='9';}}//从后往前在遍历一遍//还是如果高位大于次高位,直接高位减一,次高位变9,后面都变9for(int i=str.size()-1;i>0;i--){if(str[i-1]>str[i]){str[i]='9';//不能一直减一,剪成负数了if(str[i-1]!='0'){str[i-1]--;}}}//stoi将字符串转整数return stoi(str);} };