golang刷Leetcode系列 --- 加1

加一

给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。

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

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

示例 1:

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

示例 2:s

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

这道题做了挺长时间, 主要是第一次的思路没有考虑到数组所表示的整数可能会溢出的情况. 傻傻的把数组转换成整数, 加1之后又转换为数组.
所以这道题主要在于两点:

  1. 整数溢出的问题
  2. 如何处理每一位的进位的问题

我的思路是, 设置另一个切片result存储相加之后的整数. 关于切片的长度, 是这样确定的, 如果原数组digits每一位都是9的话,
也就是说整数最高位会产生进1, 那么result的长度就是digits长度加1. 否则, result的长度就是digits的长度.

使用carry表示进位(0或者1). 第一步先计算digits和result的最高位, 得到一个初始的carry.

然后使用循环计算digits和result的每一位, 每一位的进位都取决于上一位相加得到的值, 如果该值大于10, 进位=1, 否则进位=0


func plusOne(digits []int) []int {
	var carry int = 0
	var overflow int = 0
	var len2 int = 0

	len1 := len(digits)
	for i := 0; i < len1; i++ {
		if digits[i] == 9 {
			overflow++
		}
	}

	if overflow == len1 {
		len2 = len1 + 1
	} else {
		len2 = len1
	}

	result := make([]int, len2)

	digits[len1-1] += 1
	result[len2-1] = digits[len1-1] % 10
	if digits[len1-1] >= 10 {
		carry = 1
	}
	
	for i, j := len1 - 2, len2 - 2; i >= 0 || j >= 0; {
                //防止下标i越界
		if i >= 0 {
			digits[i] += carry	
			if digits[i] >= 10 {
				carry = 1
			} else {
				carry = 0
			}
			result[j] = digits[i] % 10
		}
                //当最高位需要进位时
		if len1 < len2 && j == 0 {
			result[j] = 1
			break
		}
			
		i--;
		j--;
	}

	fmt.Println(result)

	return result
}

func main() {
	digits := []int{1, 2, 3}
    plusOne(digits)
	//fmt.Println(result)
}
原文地址:https://www.cnblogs.com/dennis-wong/p/9410603.html