738. 单调递增的数字

思路: 对于数字x = an ... ai+1 ai ... a1 a0, 如果任意相邻的ai+1,ai不符合单调递增, 就给原数字减去(ai + 1) * 10 ^ i, 减去之后得到的新数字即为y

可以发现, 若xy不完全相同, 则最终结果在第一个不相同位之后的位必定全是9, 按此规律修正结果即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string s = to_string(N);
string olds=s;

int bor=0;
for(int i=s.size()-1;i>0;i--){
if(bor){
s[i]--;
s[i+1]+=10;
bor=0;
}
if(s[i]<s[i-1]){
// -s[i]-1
s[i]='9';
s[i-1]--;
if(s[i-1]<'0') bor = 1;
}
}

// fix
for(int i=0;i<s.size();i++){
if(s[i]<olds[i]){
for(int j=i+1;j<s.size();j++){
s[j]='9';
}
break;
}
}

// restore
int val =0;
for(int i=0;i<s.size();i++){
val=val*10+s[i]-'0';
}
return val;
}
};