给你一个正整数 n
。n
中的每一位数字都会按下述规则分配一个符号:
- 最高有效位 上的数字分配到 正 号。
- 剩余每位上数字的符号都与其相邻数字相反。
返回所有数字及其对应符号的和。
示例 1:
**输入:** n = 521
**输出:** 4
**解释:** (+5) + (-2) + (+1) = 4
示例 2:
**输入:** n = 111
**输出:** 1
**解释:** (+1) + (-1) + (+1) = 1
示例 3:
**输入:** n = 886996
**输出:** 0
**解释:** (+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0
提示:
方法一:数学
思路与算法
给你一个正整数 n,要求计算 n 的数字交替和。
我们用 sign 来表示数字的正负,并初始化为 1。每一步中,我们将 n 对 10 取模,得到个位数字,把它和 sign 相乘求和,将 sign 取相反数,再把 n 除以 10。 不断重复这一步骤,直到 n 为零。这样我们就得到了数字交替和。
最后,因为最高有效位上的数字分配到正号,我们将结果乘以 -\textit{sign 后返回。
代码
[sol1-C++]1 2 3 4 5 6 7 8 9 10 11 12
| class Solution { public: int alternateDigitSum(int n) { int res = 0, sign = 1; while (n > 0) { res += n % 10 * sign; sign = -sign; n /= 10; } return -sign * res; } };
|
[sol1-Java]1 2 3 4 5 6 7 8 9 10 11
| class Solution { public int alternateDigitSum(int n) { int res = 0, sign = 1; while (n > 0) { res += n % 10 * sign; sign = -sign; n /= 10; } return -sign * res; } }
|
[sol1-Python3]1 2 3 4 5 6 7 8
| class Solution: def alternateDigitSum(self, n: int) -> int: res, sign = 0, 1 while n: res += n % 10 * sign sign = -sign n //= 10 return -sign * res
|
[sol1-Go]1 2 3 4 5 6 7 8 9
| func alternateDigitSum(n int) int { res, sign := 0, 1 for n > 0 { res += n % 10 * sign sign = -sign n /= 10 } return -sign * res }
|
[sol1-JavaScript]1 2 3 4 5 6 7 8 9
| var alternateDigitSum = function(n) { let res = 0, sign = 1; while (n > 0) { res += n % 10 * sign; sign = -sign; n = Math.floor(n / 10); } return -sign * res; };
|
[sol1-C#]1 2 3 4 5 6 7 8 9 10 11
| public class Solution { public int AlternateDigitSum(int n) { int res = 0, sign = 1; while (n > 0) { res += n % 10 * sign; sign = -sign; n /= 10; } return res * -sign; } }
|
[sol1-C]1 2 3 4 5 6 7 8 9
| int alternateDigitSum(int n){ int res = 0, sign = 1; while (n > 0) { res += n % 10 * sign; sign = -sign; n /= 10; } return -sign * res; }
|
复杂度分析