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. 将整数转换为字符串便于遍历
  2. 初始化符号为 1(正号),结果为 0
  3. 从左到右遍历每个数字:
    • 将当前数字乘以符号加入结果
    • 符号取反准备下一位
  4. 返回最终结果

时间复杂度为 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 是输入的正整数。时间复杂度取决于数字的位数,空间复杂度主要用于存储字符串表示。

相关题目