题目:加一(简单)

一、问题描述: 

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。 

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:

输入:digits = [0]
输出:[1]

 

二、解答过程

  读完题我首先想到的一个方法就是,先把数组所表示的整数求出来,然后给整数加一,再拆分成数组。这种方法有可行性,只需要逆序遍历数组然后乘10^1,10^2,……

  显然,这种笨办法不能算最优解,因为需要新建数组,所以空间复杂度为O(n)了。所以暂不考虑这种解法。

  下面开始思考优化解法,最好的方法是通过一次遍历,直接对数组进行修改,然后返回传入的这个数组就行了。

  首先因为加一操作是整数的最后一位,所以对数组的遍历肯定是逆序的。这里分两种情况,该元素不是9;该元素等于9。

  (1)如果该元素不是9,直接把该元素加一,然后返回数组就行了;

  (2)如果该元素等于9,则需要进行进位操作,所以可能出现{9,9,9,9,9}这种数组,我需要不停的进行进位,直到遍历到一个不为9的数字或遍历到终点。

    那么可以先思考最极端的情况{9,9,9,9}这种数组元素全为9的数组,其实对数组操作的时候可以给每个元素置0,然后对数组进行扩容让第一个元素为1。

   第二种情况是{7,9,9,9}这种数组,那么在遍历到7的时候就应该给7+1然后返回数组。该操作可以在(1)完成

  以上就是我对这道算法题的大致分析过程,下面开始编代码。  

 

三、代码

  

leetcode第一题java leetcode第一题加法_数组

 

 

   

leetcode第一题java leetcode第一题加法_数组_02

 

 

 

四、总结

  这道题还是很简单的,因为是模拟对一个数的+1操作,所以需要想到逆序遍历数组,逆序遍历就是本题的解答关键,这与昨天的题有相似之处。所以在以后做题中的对数组操作可以先思考逆序遍历这种思想。