这是第五篇算法题,原力扣链接
给你一个正整数
n
。n
中的每一位数字都会按下述规则分配一个符号:
- 最高有效位 上的数字分配到 正 号。
- 剩余每位上数字的符号都与其相邻数字相反。
返回所有数字及其对应符号的和。
方法一:模拟
这个方法最容易想到,给每个数拆开放到数组里,然后按照题说的逻辑去遍历,构成最终结果值。
func alternateDigitSum(n int) int {
nums := make([]int, 0)
for i := 0; n > 0; i++ {
num := n % 10
nums = append(nums, num)
n = n / 10
}
flag := true
result := 0
for i := len(nums) - 1; i >= 0; i-- {
if flag {
result += nums[i]
} else {
result -= nums[i]
}
flag = !flag
}
return result
}
方法二:数学
显然,上述方法不是最聪明的,但是是最能解决问题的。
但是如果从数学角度看这道题也能发现一定的规律,如果我从末尾开始往前算会怎么样?
分奇偶讨论这个问题:
- 偶数场景:
符号集合为+ - + - + - 从后往前做可能会变成- + - + - + 得出的结果会相差一个负号
- 奇数场景
符号集合为 - + - + - 从后往前做可能会变成 + - + - + 得出的结果还是相差一个负号
看来和奇偶无关,亘古不变相差一个负号。那就从后往前做加上就好了
func alternateDigitSum(n int) int {
result, flag := 0, 1
for ; n > 0; n /= 10 {
result += n % 10 * flag
flag = -flag
}
return -flag * result
}