题号: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...)
}
❤如果文章对您有所帮助,就在文章的右上角或者文章的末尾点个赞吧!(づ ̄ 3 ̄)づ
❤如果喜欢大白兔分享的文章,就给大白兔点个关注吧!(๑′ᴗ‵๑)づ╭❤~
❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】
❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复讨论(请勿发表攻击言论)