题号:66. 加一
题目描述:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
题意解析:
根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:
- 除 9 之外的数字加一;
- 数字 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,
网络异常,图片无法展示
|
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...) }