关联LeetCode题号738
本题特点
- 贪心,贪心在如果非单调递增,则想要保证数字整体最大,那低数位一定为9(所有数字中最大的)
本题思路
- 从后向前遍历,如果递增则 什么都不做
- 如果非递增,增非递增位置的前一数位需要-1,当前位置需要标记,直到结束
- 标记位置后所有位置 都为9必能保证最大值
python写法
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
nums = list(str(n))
nums = list(map(lambda x: int(x), nums))
for i in range(len(nums)-1, 0, -1):
if nums[i-1] > nums[i]:
nums[i-1] -= 1
for j in range(i, len(nums)):
nums[j] = 9
nums = list(map(lambda x: str(x), nums))
s = "".join(nums)
return int(s)
Java写法
def monotoneIncreasingDigits(self, n: int) -> int:
nums = list(str(n))
nums = list(map(lambda x: int(x), nums))
start= len(nums);
for i in range(len(nums)-1, 0, -1):
if nums[i-1] > nums[i]:
nums[i-1] -= 1
start = i
# for j in range(i, len(nums)):
# nums[j] = 9
for j in range(start, len(nums)):
nums[j] = 9
nums = list(map(lambda x: str(x), nums))
s = "".join(nums)
return int(s)
Java写法
package leetcode;
import org.junit.jupiter.api.Test;
/**
* File Description: MonotoneIncreasingDigits
* Author: Your Name
* Date: 2025/1/2
*/
public class MonotoneIncreasingDigits_738 {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
for(int i=s.length()-2; i >=0; i--){
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i+1;
}
}
for (int i = start; i < s.length(); i++) {
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
@Test
public void TestMonotoneIncreasingDigits(){
int res = monotoneIncreasingDigits(332);
System.out.println(res);
}
}
Java类型转换
// Integer.valueOf(12); //自动装箱
// Double.valueOf(12.9);
// Integer t = Integer.valueOf(12);
// int intt = t.intValue(); //自动拆箱
// String sa = t.toString();
// int aaa = Integer.parseInt(sa);//String 转成对应的int
char[] chars = sa.toCharArray(); //字符串转成 字符数组
String.valueOf(chars); //将字符数组转成字符串