题目描述
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 :
输入: N = 989998
输出: 899999
总结
这题可以说简单到爆,只是看你怎么写了
DSC:我虽然写的丑,但跑的快阿
Demo & Sample Code
class Solution {
public int monotoneIncreasingDigits(int N) {
int index = -1;
String s = String.valueOf(N);
for(int i = 0; i < s.length()-1; i++) {
if(s.charAt(i) > s.charAt(i+1)) {
int pre = i;
while(pre >0 && s.charAt(pre) == s.charAt(pre-1)) pre--;
index = pre;
break;
}
}
if(index == -1) return N;
int res = 0;
for(int i = 0; i < index; i++)
res = res*10 + (s.charAt(i)-'0');
res = res*10 + (s.charAt(index)-'0'-1);
for(int i = index+1; i < s.length(); i++) {
res = res*10 + 9;
}
return res;
}
}
Demo Code
class Solution {
public int monotoneIncreasingDigits(int n) {
int value = n;
int[] number = new int[10];
for(int i = 0; value > 0; value /= 10) // 按照倒序存
number[i++] = value % 10;
for(int i = number.length - 2; i > 0; i--) {
if(number[i] > number[i - 1]) { // 前一位大于后一位
for(int j = i; j < number.length; j++) {
if(number[j] - 1 >= number[j+1]) {
int base = (int) Math.pow(10, j);
int result = number[j] * base - 1;
for(j++, base *= 10; j < number.length; j++, base *= 10)
result += number[j] * base;
return result;
}
}
}
}
return n;
}
}
Sample && Demo Code
class Solution {
public int monotoneIncreasingDigits(int N) {
char[] res = String.valueOf(N).toCharArray();
int p = 0;
for(int i = 1; i < res.length; i++) {
if(res[i] > res[i-1]) //为什么不写>=,不是为了剪枝,是为了处理像332这种情况
p = i;
else if(res[i] < res[i-1])
break;
}
if(p+1 == res.length) return N;
res[p] -= 1;
while(++p != res.length)
res[p] = '9';
return Integer.valueOf(new String(res));
}
}