本题由于要对数字的每一位进行处理,于是想到首先将 int 类型 转化为 string,这样对每一位处理会更加方便。
- 当 n 只有个位数时,直接返回n即可
- 将 n 转化为 string 类型,从后往前遍历字符串,如果比前者小,那么就修改后者为 ‘9’,并将前者 - 1,注意是 -1,而不是 - ‘1’
- 此时我们并没有完成所有的操作,我们只处理了 后者比前者小这种情况,如果 之前 满足单调递增,但 后续的遍历,发生了上面的借位操作,就不再满足单调递增了
- 因此再后序遍历后,我们再进行一次跳过首位的顺序遍历,因为首位经过借位,后位置9,首位一定是小于9的,如果借位后 首位为0,那么便将首位舍去。 在本次顺序遍历中,我们需要将不是单调递增的位数都置为’9’
class Solution {
public:
int monotoneIncreasingDigits(int n) {
if(n <= 9){
return n;
}
string s = to_string(n);
for(int i = s.size() - 1; i > 0; i--){
if(s[i] < s[i - 1]){
s[i] = '9';
s[i - 1] -= 1;
}
}
for(int i = 1; i < s.size(); i++){
if(s[i] < s[i - 1]){
s[i] = '9';
}
}
if(s[0] <= '0'){
s.erase(s.begin());
}
int result = stoi(s);
return result;
}
};