2544-交替数字和

Raphael Liu Lv10

给你一个正整数 nn 中的每一位数字都会按下述规则分配一个符号:

  • 最高有效位 上的数字分配到 号。
  • 剩余每位上数字的符号都与其相邻数字相反。

返回所有数字及其对应符号的和。

示例 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

提示:

  • 1 <= n <= 109

方法一:数学

思路与算法

给你一个正整数 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;
}

复杂度分析

  • 时间复杂度:O(\log n)。取决于 n 的数字位数。

  • 空间复杂度:O(1)。

 Comments
On this page
2544-交替数字和