Easy
题目描述
给你一个正整数 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
提示:
1 <= n <= 10^9
解题思路
解题思路
这道题需要计算数字各位的交替符号和。有两种主要思路:
方法一:从左到右遍历(推荐)
最直观的方法是将数字转换为字符串,从最高位开始遍历。最高位为正号,后续每位都与前一位符号相反。使用一个符号变量 sign 来控制当前位的符号,每次遍历后将符号取反。
方法二:从右到左遍历
也可以通过取模和除法操作从个位开始提取数字。但需要先计算数字的位数来确定最高位的符号,稍微复杂一些。
算法步骤(方法一):
- 将整数转换为字符串便于遍历
- 初始化符号为 1(正号),结果为 0
- 从左到右遍历每个数字:
- 将当前数字乘以符号加入结果
- 符号取反准备下一位
- 返回最终结果
时间复杂度为 O(log n),空间复杂度为 O(log n)(字符串存储)或 O(1)(直接计算)。
代码实现
class Solution {
public:
int alternateDigitSum(int n) {
string s = to_string(n);
int result = 0;
int sign = 1;
for (char c : s) {
int digit = c - '0';
result += sign * digit;
sign = -sign;
}
return result;
}
};
class Solution:
def alternateDigitSum(self, n: int) -> int:
s = str(n)
result = 0
sign = 1
for digit_char in s:
digit = int(digit_char)
result += sign * digit
sign = -sign
return result
public class Solution {
public int AlternateDigitSum(int n) {
string s = n.ToString();
int result = 0;
int sign = 1;
foreach (char c in s) {
int digit = c - '0';
result += sign * digit;
sign = -sign;
}
return result;
}
}
/**
* @param {number} n
* @return {number}
*/
var alternateDigitSum = function(n) {
const s = n.toString();
let result = 0;
let sign = 1;
for (let i = 0; i < s.length; i++) {
const digit = parseInt(s[i]);
result += sign * digit;
sign = -sign;
}
return result;
};
复杂度分析
| 复杂度 | 大小 |
|---|---|
| 时间复杂度 | O(log n) |
| 空间复杂度 | O(log n) |
其中 n 是输入的正整数。时间复杂度取决于数字的位数,空间复杂度主要用于存储字符串表示。