LeetCode-66. 加一(Goland实现)

170 阅读2分钟

题号:66. 加一

题目描述:

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

题意解析:      

根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:

  1. 除 9 之外的数字加一;
  2. 数字 9。

加一得十进一位个位数为 0 加法运算如不出现进位就运算结束了且进位只会是一。所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 1 个位数置为 0,如此循环直到判断没有再进位就退出循环返回结果。然后还有一些特殊情况就是当出现 99、999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。

示例1:

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

 示例2:

输入: [8,9,9,9]
输出: [9,0,0,0]
解释: 输入数组表示数字 8999  ==> 8999 + 1 = 9000

优化前:思路清晰 ,浅显易懂

func plusOne(digits []int) []int {
	if len(digits) == 0 {
		return nil
	}
        //目的在:用于首位插入1 防止首位需要9进10 的情况
	var l = []int{1}
        //判断末尾不是9 不需要进位的情况 只需最后一位元素加1反正即可
	if digits[len(digits)-1] < 9 {
		digits[len(digits)-1]--
		return digits
	}
	//标记进位,由于第一次肯定需要进位,则初始flag为1
        var flag = 1
        //以下是处理末尾是9 需要进位的情况
	for i := len(digits) - 1; i >= 0; i-- {
		b := isPut(digits[i] + flag)
		//说明需要进位
		if b {
			flag = 1
			digits[i] = 0
                        //处理首位是9需要进位的情况
			if i-1 < 0 {
				digits = append(digits[:0], append(l, digits[0:]...)...)
				break
			}
		} else {
                       //不需要进位
			digits[i] = digits[i] + flag
			flag = 0
		}
	}
	return digits
}

//校验是否需要进位
func isPut(num int) bool {
	if num == 10 {
		return true
	}
	return false
}

优化后:代码简洁高效,双百法,思路清奇!秒啊!!

思路来源:LeetCode题友分享

解析:省略掉中间进位标记,直接判断是否为9 ,为9说明需要进1 直接将当前值变为0即可,不为9 直接return,

截图.PNG

func plusOne(digits []int) []int {
	l := len(digits)
    var one = []int{1}
	if l == 0 {
		return nil
	}
	for i := l-1; i>= 0; i-- {
		if digits[i] != 9 {
			digits[i]++
			return digits
		} else {
			digits[i] = 0
		}
	}
        //直接将1插入首位
	return append(one, digits...)
}

❤如果文章对您有所帮助,就在文章的右上角或者文章的末尾点个赞吧!(づ ̄ 3 ̄)づ

❤如果喜欢大白兔分享的文章,就给大白兔点个关注吧!(๑′ᴗ‵๑)づ╭❤~

❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】

❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复讨论(请勿发表攻击言论)