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