题目:
分析:
首先分析题目给出的条件,输出的数不能大于输入的数,且输出的数的各个位数单调递增的。解决这类条件限定题目,可以有两种思路:
- 在位数等确定的情况下可以使用for循环以及if else进行筛选和判断。
- 在位数不确定的情况下,一般通过对原数组的遍历修改,达到目标。
这两种情况都需要对条件充分认识,后者会更加趋向于对规律的判断。我们选择第二种方法,输入的位数是不确定的,输出的位数可能和它相同,也可能少一位(高位变为0)。接下来通过例子来找规律,高位是关键,当高位数字大于低位数字的时候,我们肯定不能把低位的数字变大,这会导致它大于原数,所有只能把高位-1,此时低位都改为9即可达到最大。这种判断可以从低位往高位逐位判断上去,不断调整就可以了。
我的求解思路: - 先取出各个位数保存在ArrayList中,方便修改。
- 然后从低位到高位遍历数据。
- 发现高位大于低位数字,则把高位-1,低位都改为9。
- 最后处理高位0。
- 遍历生成结果并返回。
- 加上对10及以下的特殊情况处理。
算法实现(Java):
class Solution {
public static void main(String[] args){
System.out.println(new Solution().monotoneIncreasingDigits(332));
}
public int monotoneIncreasingDigits(int N) {
ArrayList<Integer> arrayList=new ArrayList<>();
if(N==0){
return 0;
}else if(N<=10){
return N-1;
}
while(N>0){
arrayList.add(N%10);
N=N/10;
}
int len=arrayList.size();
for(int i=0;i<len-1;i++){
if(arrayList.get(i+1)>arrayList.get(i)){
arrayList.set(i+1,arrayList.get(i+1)-1);
for(int j=0;j<=i;j++){
arrayList.set(j,9);
}
}
}
if(arrayList.get(len-1)==0){
arrayList.remove(len-1);
}
int num=0;
for(int i=arrayList.size()-1;i>=0;i--){
num=num+arrayList.get(i);
if(i!=0)
num=num*10;
}
return num;
}
}