给定非负整数N,找到具有单调非递减数字的小于或等于N的最大数字.
(回想一下,当且仅当每对相邻数字x和y满足x <= y时,整数具有单调非递减数字.) 例1:
输入:N = 10
输出:9
例2:
输入:N = 1234
输出:1234
例3:
输入:N = 332
产量:299
注意:N是[0,10 ^ 9]范围内的整数.
嗨,我正在尝试实现上述问题,并且我在超大整数的情况下超出时间限制.你能告诉我如何优化我的解决方案吗?谢谢.
代码:
class Solution {
public int monotoneNondecreasingDigits(int N) {
int num = N;
int quot=0,rem=0;
List<Integer> res = new ArrayList<>();
while( num>=0 ){
if( checkMontone(num) )
res.add(num);
if( res.size() == 2 )
break;
num -= 1;
}
return Collections.max(res);
}
public boolean checkMontone(int num ){
String s = Integer.toString(num);
for( int i=1;i<s.length();i++ ){
if( (int)s.charAt(i-1) > (int)s.charAt(i) )
return false;
}
return true;
}
}
最佳答案 您不应该使用任何列表,因为您可以直接处理您的号码数字.想法是找到大于左边数字Dk-1的第一个数字Dk(如果从左到右).在此之后,Dk-1之后的所有内容都应设置为9以增加数量.但是,它可能不是最大的数字,因为Dk-1可能等于Dk-2,依此类推.这就是为什么找到最左边的数字D1以便Dl = Dk-1并且现在它可以递减并且其后的每个其他数字设置为9的重要性.
private static void printLargestMonoton(String number) {
char[] chars = number.toCharArray();
int i = 0;
// find a position after which the requirement is violated
while (i < chars.length - 1) {
if (chars[i] > chars[i + 1]) {
break;
}
i++;
}
// if at the end then the number is already the valid one
if (i == chars.length - 1) {
System.out.println(String.valueOf(chars));
return;
}
// find the left most position to decrement
while (i >= 1 && chars[i - 1] == chars[i]) {
i--;
}
// it can happen only for the leftmost digit so mark it to empty it later
if (chars[i] == '1') {
// get rid of this char later to avoid a leading zero
chars[i] = '\0';
} else {
chars[i]--;
}
// all the digits to the right must be 9
for (i = i + 1;i < chars.length; i++) {
chars[i] = '9';
}
System.out.println(String.valueOf(chars).replace("\0",""));
}
public static void main(String[] args) {
String[] numbers = new String[]{"10", "1234", "332", "12214512", "11110"};
for (String number : numbers) {
printLargestMonoton(number);
}
}
产量
9
1234
299
11999999
9999