單調遞增的數

jingxindeyi發表於2020-12-15
給定一個非負整數 N,找出小於或等於 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。

(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)

示例 1:

輸入: N = 10
輸出: 9
示例 2:

輸入: N = 1234
輸出: 1234

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/monotone-increasing-digits
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
  1. 暴力遍歷 - 超時
class Solution {
   public int monotoneIncreasingDigits(int N) {
        int curr = N + 1;
        while (--curr >= 0) {
            if(isZeng(curr)) {
                return curr;
            }
        }
        return 0;
    }

    private boolean isZeng(int n) {
        while (true) {
            if (n < 10) {
                return true;
            }
            int a = n % 10;
            int b = (n / 10) % 10;
            if (a < b) {
                return false;
            }
            n = n / 10;
        }
    }
}
  1. 仔細想想 結果是可以由當前的數直接推出來的
    因為要最大 所以優先從數的右邊開始計算(這樣減去的數值是最小的)
    如果當前位數需要減1 則把其右邊的數值都置9
class Solution {
   public int monotoneIncreasingDigits(int N) {
          if (N < 10) {
            return N;
        }
        List<Integer> ints = new ArrayList<>();
        int num = N;
        while (num > 0) {
            ints.add(num % 10);
            num /= 10;
        }
        Collections.reverse(ints);

        for (int i = ints.size() - 1; i >= 0; i--) {
            boolean adjust = false;

            for (int j = i + 1; j < ints.size(); j++) {
                if (adjust) {
                    ints.set(j, 9);
                }
                if (ints.get(j) < ints.get(i)) {
                    ints.set(i, ints.get(i) - 1);
                    ints.set(j, 9);
                    adjust = true;
                }
            }
        }

        Collections.reverse(ints);
        int result = 0;
        int radix = 1;
        for (int i = 0; i < ints.size(); i++) {
            result += ints.get(i) * radix;
            radix *= 10;
        }
        return result;
    }

   
}

相關文章