本文共 1655 字,大约阅读时间需要 5 分钟。
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:
输入: [1,2,3]
输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
方法一:执行(暂无结果),内存97.32%
func plusOne1(digits []int) []int { l := len(digits) // 是否需要增加一位 k := 1 for i := l - 1; i >= 0; i-- { v := digits[i] + 1 if v >= 10 { // 如果已经循环完毕,则还多出一个1,在后面补齐 digits[i] = v - 10 } else { digits[i] = v k = 0 break } } // 如果需要增加一位则重组切片 if k == 1 { digits = append([]int{ 1}, digits...) } return digits}
方法二:执行(暂无结果),内存97.32%
和方法一比没什么不同,就是减少几个变量func plusOne2(digits []int) []int { // 是否需要增加一位 k := 1 for i := len(digits) - 1; i >= 0; i-- { digits[i]++ if digits[i] >= 10 { // 如果已经循环完毕,则还多出一个1,在后面补齐 digits[i] -= 10 } else { k = 0 break } } // 如果需要增加一位则重组切片 if k == 1 { digits = append([]int{ 1}, digits...) } return digits}
两种方法里,其中一个用了变量v
来存储digital[i]
的值进行操作,而另一个是直接用digital[i]
进行操作,各有优劣,但是依照前几题的经验,如果在较长的切片中用digital[i]
直接进行操作会影响执行效率。但本次测试并未能得到执行效率的排行,所以暂时未知哪种方法更好。
笑:
刚拿到手的时候第一反应是把切片整合成整数,再+1,得到的数切割一下不就行了? 于是~~func plusOne3(digits []int) []int { var r []int var s string // 将切片内数字整合为字符串 for _, v := range digits { s += strconv.Itoa(v) } // 将字符串变为整数 d, err := strconv.Atoi(s) if err != nil { return r } // 整数+1 d++ // 整数变字符串 s = strconv.Itoa(d) // 字符串变切片 for _, v := range s { if y, err := strconv.Atoi(string(v)); err == nil { r = append(r, y) } } // 返回 return r}
展示这种方法只是提供一种思路,其结果是错的,其只能用于整数范围计算,如果给的切片是:
[]int{1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9}
很显然超出整数位数了,无法进行计算,结果也必然是[]int{}
转载地址:http://ztkpi.baihongyu.com/