738. Monotone Increasing Digits(单调递增的数字)

题目:
在这里插入图片描述
分析:
首先分析题目给出的条件,输出的数不能大于输入的数,且输出的数的各个位数单调递增的。解决这类条件限定题目,可以有两种思路:

  • 在位数等确定的情况下可以使用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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值