这题用栈好解决,因为涉及到进位,后面再将数据遍历出来

题目描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头

示例 1:

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

示例 2:

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

解题思路:

  1. 初始化一个栈,一个是否进位的标记。从尾部遍历数组。因为尾部代表数组的最小位,所以第一次一定要执行加1操作的。
  2. 如果加1操作==10,则栈放入0,并将进位继续设置进位。如果不==10,则将原值+1,并重置进位为0
  3. 最后退出循环后,还要判断一次是否进位,是栈进入。像999+1,最后三位数变成四位数
  4. 将栈里的数据依次出栈放入结果集,即为结果

go示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func plusOne(digits []int) []int {
    // 数组模拟栈
   stack := make([]int, 0)
   isPlus := 1
   for i := len(digits) - 1; i >= 0; i--{
       if isPlus == 1 {
           // 值相加==10,进位,并继续下一个循环
           if digits[i] + 1 == 10 {
               stack = append(stack, 0)
               isPlus = 1
               continue
           }
           // 值相加不为10
           stack = append(stack, digits[i] + 1)
           isPlus = 0
       } else {
           stack = append(stack, digits[i])
           isPlus = 0
       }
   }
   // 判断最后一个数是不是要进们,即二位变成三位数这种情况
   if isPlus == 1 {
       stack = append(stack, 1)
   }
   // 后面代码类似出栈,将原数组逆序放入结果集
   length := len(stack) - 1
   results := make([]int, len(stack))
   for i := length; i >= 0; i-- {
       results[length - i] = stack[i]
   }
   return results
}