力扣738题(单调递增的数组)
738、单调递增的数组
基本思想:
贪心
具体实现:
基本数据类型转换为字符串类型:
1、将基本数据类型与空字符串(" ")连接(+)即可获得其所对应的字符串
2、调用String 类中的valueOf()方法返回相应字符串
3、使用包装类的toString()方法
int hh = 123; String s1 = hh + ""; String s2 = String.valueOf(hh); String s3 = Integer.toString(hh);
字符串类型转换为基本数据类型:
1、调用基本数据类型对应的包装类中的方法parseXXX(String)
2、对应包装类型的valueOf(String)
String str = "123"; int str1 = Integer.parseInt(str); int str2 = Integer.valueOf(str);
举例:98
一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),
首先让strNum[i - 1]--
然后strNum[i]变为9(不管是啥例子,最后一位直接变成9)
这个整数就是89,即小于98的最大的单调递增整数。
从前向后遍历,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。
举例:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
代码:
class Solution { public int monotoneIncreasingDigits(int n) { String[] strings = (n + "").split(""); int start = strings.length; for (int i = strings.length - 1; i > 0; i--){ if (Integer.parseInt(strings[i]) < Integer.parseInt(strings[i - 1])) { strings[i - 1] = (Integer.parseInt(strings[i-1]) - 1) + ""; start = i; } } for (int i = start; i < strings.length; i++){ strings[i] = "9"; } return Integer.parseInt(String.join("",strings)); } }
class Solution { public int monotoneIncreasingDigits(int n) { String string = n + ""; char[] c = string.toCharArray(); int start = c.length; for (int i = c.length - 1; i > 0; i--){ if (c[i] < c[i - 1]) { c[i - 1]--;// 和c[i - 1] = c[i - 1] - 1不一样 start = i; } } StringBuilder s = new StringBuilder(); for (int i = 0; i < c.length; i++) { if (c[i] == '0' && i == 0) { continue; } if (i >= start) { s.append("9"); } else { s.append(String.valueOf(c[i])); } } return Integer.valueOf(s.toString()); } }
浙公网安备 33010602011771号