【LeetCode】738. 單調遞增的數字

Curryxin發表於2021-08-12

738. 單調遞增的數字

知識點:字串;貪心

題目描述

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

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

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

輸入: N = 1234
輸出: 1234

輸入: N = 332
輸出: 299


解法一:貪心

想一下這個過程,如果比前一位大的話那就可以不用動直接返回;如果比前一位小的話例如98,應該怎麼做呢,我們取小於等於8的都沒用,因為都比前一位要小,不滿足遞增,所以只能讓前一位變小一位了,9變成8,那我們最後一位自然要取到9,高位數和這個二位數一個道理,只要有比前一位小的了,那自然要把前一位-1,後面所有位變為9;

但是還有一點要注意,比如332,我們找到2小了,那把前一位減1了,但是減完之後自己又比更前一位的小了,所有更前一位也得減1;只要自己前面減1了,那自己就不用管了,賦成9就行,所以還要找到減完之後仍然滿足遞增的那個位置;

所以這道題是在找兩個位置

  • 往後找:第一個比前一位小的位置;
  • 往前找:往前開始-1後第一個仍然滿足遞增的位置;
class Solution {
    public int monotoneIncreasingDigits(int n) {
        char[] str = Integer.toString(n).toCharArray();  //轉換成字元陣列方便操作,注意這個方法;
        int i = 1;
        while(i < str.length && str[i] >= str[i-1]){
            i++;  //往後找:找到第一個比前一位小的元素;
        }
        if(i < str.length){
            while(i > 0 && str[i] < str[i-1]){
                str[i-1]--; //往前找:前一位-1後可能又比更前一位小了,所以迴圈往前找到滿足遞增的;
                i--;
            }
            for(i += 1; i < str.length; i++){
                str[i] = '9';  //後面全是9就可以了;
            }
        }
        return Integer.parseInt(new String(str)); //字元陣列轉成字串,再轉成陣列;
    }
}

體會

要學會整形轉字串,轉字元陣列:Integer.toString(n).toCharArray();
要學會字元陣列轉字串,轉整形:Integer.parseInt(new String(str));

相關文章