Description#
An integer has monotone increasing digits if and only if each pair of adjacent digits x
and y
satisfy x <= y
.
Given an integer n
, return the largest number that is less than or equal to n
with monotone increasing digits.
Example 1:
Input: n = 10
Output: 9
Example 2:
Input: n = 1234
Output: 1234
Example 3:
Input: n = 332
Output: 299
Constraints:
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
s = list(str(n))
i = 1
while i < len(s) and s[i - 1] <= s[i]:
i += 1
if i < len(s):
while i and s[i - 1] > s[i]:
s[i - 1] = str(int(s[i - 1]) - 1)
i -= 1
i += 1
while i < len(s):
s[i] = '9'
i += 1
return int(''.join(s))
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Solution {
public int monotoneIncreasingDigits(int n) {
char[] s = String.valueOf(n).toCharArray();
int i = 1;
for (; i < s.length && s[i - 1] <= s[i]; ++i)
;
if (i < s.length) {
for (; i > 0 && s[i - 1] > s[i]; --i) {
--s[i - 1];
}
++i;
for (; i < s.length; ++i) {
s[i] = '9';
}
}
return Integer.parseInt(String.valueOf(s));
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int i = 1;
for (; i < s.size() && s[i - 1] <= s[i]; ++i)
;
if (i < s.size()) {
for (; i > 0 && s[i - 1] > s[i]; --i) {
--s[i - 1];
}
++i;
for (; i < s.size(); ++i) {
s[i] = '9';
}
}
return stoi(s);
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| func monotoneIncreasingDigits(n int) int {
s := []byte(strconv.Itoa(n))
i := 1
for ; i < len(s) && s[i-1] <= s[i]; i++ {
}
if i < len(s) {
for ; i > 0 && s[i-1] > s[i]; i-- {
s[i-1]--
}
i++
for ; i < len(s); i++ {
s[i] = '9'
}
}
ans, _ := strconv.Atoi(string(s))
return ans
}
|