1. 程式人生 > 其它 >【LeetCode】每日一題738. 單調遞增的數字

【LeetCode】每日一題738. 單調遞增的數字

技術標籤:每日一題leetcodejava演算法

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)); }

執行結果

在這裡插入圖片描述