题目(leecode T738):
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
方法:返回小于等于当前数字的最大单调递增数字。我们需要考虑出现非递增的数字是什么情况,例如98就是非递增的数字,此时小于等于98的最大递增数字是89,具体变化是将个位数字变为最大的数字9,十位数字减一。抽象一下就是strnum[i-1]>strnum[i]时,将strnum[i]变为9,strnum[i-1]减一。然后考虑从前向后遍历还是从后向前遍历,因为我们是将前一位数字减一,后一位数字变为9.如果从前向后遍历的话可能出现遍历后的数字仍然大于前面的情况,因此我们需要从后向前遍历。这样才能使用已经遍历后的数字。
如321,从后向前会变为321-》319-》299.
题解:
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int flag = strNum.size();
for(int i = strNum.size() - 1; i > 0; i--){ //从后向前遍历
if(strNum[i - 1] > strNum[i]){
flag = i;
strNum[i - 1]--;
}
}
for(int i = flag; i < strNum.size(); i++){ //从flag开始所有的元素都变为9
strNum[i] = '9';
}
return stoi(strNum);
}
};