【LeetCode】每日一題738. 單調遞增的數字
阿新 • • 發佈:2020-12-24
738. 單調遞增的數字
給定一個非負整數 N,找出小於或等於 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)
示例 1:
輸入: N = 10
輸出: 9
示例 2:
輸入: N = 1234
輸出: 1234
示例 3:
輸入: N = 332
輸出: 299
說明: N 是在 [0, 10^9] 範圍內的一個整數。
解題思路:
- 如果原數字是單調遞增,那麼結果就等於原數字
- 反之,結果應在某一位減一,此後的位數全部為9,要做的事情就是找出那個位置。
將數字轉為字串再轉為char陣列方便遍歷,找到第一處 char[i] > chars[i + 1],按照規則此時char[i]應該減一,但由於 char[i - 1] 可能等於 char[i],char[i]減一後破壞了單調遞增,所以又得向前遍歷,找到 char[i - 1] > char[i],此時 char[i] 才是應該減一的那一位,此後的位置全部是9,最後,組裝成 int 返回。
方法一:
public int monotoneIncreasingDigits(int N) {
char[] chars = Integer.toString(N).toCharArray ();
int n = chars.length;
int i = 0;
while (i < n - 1 && chars[i] <= chars[i + 1]) {
i += 1;
}
// 原數是單調遞增
if (i == n - 1) {
return N;
}
while (i > 0 && chars[i] == chars[i - 1]) {
i -= 1;
}
chars[i] -= 1;
while ( ++i < n) {
chars[i] = '9';
}
return Integer.parseInt(new String(chars));
}