1. 程式人生 > 其它 >738. 單調遞增的數字

738. 單調遞增的數字

目錄

738. 單調遞增的數字

題目

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

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

示例 1:

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

輸入: N = 1234
輸出: 1234
示例 3:

輸入: N = 332
輸出: 299
說明: N是在[0, 10^9]範圍內的一個整

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/monotone-increasing-digits


著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解

這個數n的長度我們是不知道的,那麼如何獲取每個位數的值?

可以轉換成陣列,高位在前面,低位在後面。

從後往前遍歷比較,如231,暴力求解的話,應該先考慮231,230....這樣才能返回符合條件的最大整數。並且如果從後往前遍歷,修改了個位數的1,那跟著十位也要修改,那是不是還要考慮百位需不需修改?

那麼比較之後,如果不符合條件要怎麼修改?
條件1:找出小於或等於N的最大的整數
條件2:各個位數上的數字是單調遞增

1比3小,那麼不符合條件2,我們需要取比3大的,取3-9的哪一個?根據條件1,取最大的9並且需要讓3-1,不然就不符合條件1了。
如果該位變成了9,那麼該位後面的也要全部變成9。需要一個flag記錄最後一個變9的位置。

程式碼

class Solution {
    public int monotoneIncreasingDigits(int n) {
        if(n<10)return n;  
        String num = n + "";
        char[] arr=num.toCharArray();
        int len = arr.length;   
        int flag=len;
        for(int i=len-1;i>0;i--){
            if(arr[i]<arr[i-1]){ //記錄變為9的位置
                flag = i;
                arr[i-1] --; //前一位-1
            }
        }
		//變為9的最高位的後面位全部都要為9
         for (int i = flag; i < len; i++) {
            arr[i] = '9';
        }
        return Integer.parseInt(new String(arr));
    }
}