题目
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
- 分析:
S1:分离出输入N的各个位数上的数字,存起来
num[10]={个,十,百,千,万};
S2:判断num[10] 上的数字是否的单调递减的
S2.1如果是,那么返回;
S2.1 如果不是,则N=N-1;
public int monotoneIncreasingDigits(int N) {
if (N / 10 == 0) {
return N - 1;
}
for(int i=N;i>0;){
int nums[]=new int[10];
int index=0;
int temp=i;
while (temp > 0) {
int num = temp % 10;
nums[index] = num;
temp = temp / 10;
index++;
}
boolean flag=true;
for(int j=0;j<index-1;j++){
//降序是true 升序是false
if(nums[j]<nums[j+1]){
flag=false;
break;
}
}
if(flag){
return i;
}else{
i=N--;
}
}
return 0;
}
提交之后,超时了。
- 优化
直接将N转为字符数组nums[0…n-1];
从n-1 开始,如果nums[j-1] > nums[j],那么高位-1,nums[j,n-1]右边的全部变为9
public int monotoneIncreasingDigitsPro(int N) {
char[] nums=String.valueOf(N).toCharArray();
int index=nums.length;
for(int j=index-1;j>0;j--){
//降序是true 升序是false
if(nums[j-1]>nums[j]){
//高位-1
nums[j-1]=(char)(nums[j-1]-1);
//地位变成9
for(int i=j;i<index;i++){
nums[i]='9';
}
}
}
return Integer.parseInt(String.copyValueOf(nums));
}