题目来源:https://leetcode.cn/problems/monotone-increasing-digits/description/
C++题解:像1234就可以直接返回1234,像120需要从个位往高位遍历,2比0大,那么2减一成为1,0变成9,变成119。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
vector<int> num;
// 保存n的每个位数
while(n){
int dan = n % 10;
num.push_back(dan);
n = (n - dan) / 10;
}
int len = num.size();
if(len <= 1) return n;
vector<int> nres(len);
// 从最低位开始更新,如果当前位比下一位小(即不满足递增),当前位-1,比它低位全部变为9.
nres[0] = num[0];
for(int j = 1; j < len; j++){
if(num[j] <= nres[j-1]) nres[j] = num[j];
else {
nres[j] = num[j] - 1;
for(int k = 0; k < j; k++) {
nres[k] = 9;
}
}
}
// 将数组转换成数字
int res = 0;
for(int mm = 0; mm < len; mm++){
res = res + nres[mm]*pow(10, mm);
}
return res;
}
};
写法来源代码随想录,会用字符串函数真的很重要。
string strNum = to_string(N); // int转字符串
int num = stoi(strNum); // 字符串转int
class Solution {
public:
int monotoneIncreasingDigits(int N) {
string strNum = to_string(N);
// flag用来标记赋值9从哪里开始
// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
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++) {
strNum[i] = '9';
}
return stoi(strNum);
}
};