leetcode_66. 加一

加一

题目

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

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

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

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

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/plus-one

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

从最后一位做加法 要考虑为9加一进位的问题,以及最后超过数组长度的情况(9999)

  • 0~8: 直接+1,然后break出循环
  • 9:置0,继续往前

注意最后还要判断首位是否为0

解答

func plusOne(digits []int) []int {
    for i := len(digits)-1; i >= 0; i-- {
        if digits[i] != 9 {
            digits[i]++
            break
        }
        digits[i] = 0
    }

    if digits[0] == 0 {
        digits = append([]int{1}, digits...)
    }
    return digits
}

// 执行用时 :0 ms, 在所有 Go 提交中击败了100.00%的用户
// 内存消耗 :3.3 MB, 在所有 Go 提交中击败了97.77%的用户

收获

对于循环条件,每次进行len()操作,是否会拖慢计算:不存在, 长度lenslice本身的一个属性,获取其值就是访问变量,没必要再创建一个变量才存储这个值(针对本题的场景)

// slice的底层结构体设计
type slice struct {  
    array unsafe.Pointer
    len   int
    cap   int
}

分享: