(leetcode66)Plus one

题目介绍:传入数组加一后返回

题目分析:正常加一没问题,特别的是满9进1要考虑两种情况,一种是非首位,非首位满9进1此位变0,高一位+1,如果出现59999这种情况,就要谨慎了;另一种情况是首位像999,数组需要扩容,然后原首位变0,新首位变1。

算法一:标准答案

public int[] plusOne(int[] digits) {
        
	    int n = digits.length;
	    //循环n次,从后往前
	    for(int i=n-1; i>=0; i--) {
	        if(digits[i] < 9) {
	        	//当前值小于9,直接+1结束
	            digits[i]++;
	            return digits;
	        }
	        //不是9,此位变零后,循环,然后下一位要么小于9,加一;
	        //要么等于9变零;再不然,执行了n次,还是9,结束for循环,出去就是一个扩容,因为前面都是9进一变0
	        //所以只要在首位加1就可以了
	        digits[i] = 0;
	    }
	    //数组扩容,结果总是10000....
	    int[] newNumber = new int [n+1];
	    newNumber[0] = 1;
	    
	    return newNumber;
	}

算法二:处理首位9问题,用了copyof,但又不知道怎么在数组第一位插数据,只能再次for了。

public int[] plusOne(int[] digits) {
		/*
		 * //判断首位是否为0, if(digits[0] == 0) { return digits; }
		 */
		int[] retult = digits;
		//循环n次
		for (int i = digits.length-1; i >= 0; i--) {			
			//尾数加1
			digits[i] = digits[i] + 1;
			if(digits[i]!=10) {
				//不进一结,束
				retult = digits;
				return retult;
			}else {
				//进一,判断是否首位,是则数组扩容,此位变10变0,扩容为变1
				if(i == 0) {
					int[] array2 = Arrays.copyOf(digits, digits.length+1);
					array2[0] = 1;array2[1] = 0;
					for(int j = 2;j<array2.length;j++) {
						array2[j] = digits[j-1];
					}
					retult = array2;
					return retult;
				}else {
					digits[i] = 0;
				}
			}
		}
		return retult;
	}

作者的话:算法一是leetcode讨论区的同学给出的,算法二自己写的,emmm...感觉写了好多多余的代码,总是直观的一步步根据流程写判断,算法一巧妙在于for循环结束返回10000....。

Ending

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值