===问:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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{}