738. 單調遞增的數字
阿新 • • 發佈:2021-08-09
目錄
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
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)); } }