Welcome to Subscribe On Youtube
2544. Alternating Digit Sum
Description
You are given a positive integer n. Each digit of n has a sign according to the following rules:
- The most significant digit is assigned a positive sign.
- Each other digit has an opposite sign to its adjacent digits.
Return the sum of all digits with their corresponding sign.
Example 1:
Input: n = 521 Output: 4 Explanation: (+5) + (-2) + (+1) = 4.
Example 2:
Input: n = 111 Output: 1 Explanation: (+1) + (-1) + (+1) = 1.
Example 3:
Input: n = 886996 Output: 0 Explanation: (+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0.
Constraints:
1 <= n <= 109
Solutions
Solution 1: Simulation
We can directly simulate the process as described in the problem.
We define an initial symbol $sign=1$. Starting from the most significant digit, we take out one digit $x$ each time, multiply it by $sign$, add the result to the answer, then negate $sign$, and continue to process the next digit until all digits are processed.
The time complexity is $O(\log n)$, and the space complexity is $O(\log n)$. Here, $n$ is the given number.
Solution 2
This implementation follows the required operations directly. It traverses the relevant values and updates its state as each value is processed. After all required states have been considered, the maintained result is returned.
-
class Solution { public int alternateDigitSum(int n) { int ans = 0, sign = 1; for (char c : String.valueOf(n).toCharArray()) { int x = c - '0'; ans += sign * x; sign *= -1; } return ans; } } -
class Solution { public: int alternateDigitSum(int n) { int ans = 0, sign = 1; for (char c : to_string(n)) { int x = c - '0'; ans += sign * x; sign *= -1; } return ans; } }; -
class Solution: def alternateDigitSum(self, n: int) -> int: return sum((-1) ** i * int(x) for i, x in enumerate(str(n))) # Solution 2 class Solution: def alternateDigitSum(self, n: int) -> int: ans, sign = 0, 1 for c in str(n): x = int(c) ans += sign * x sign *= -1 return ans -
func alternateDigitSum(n int) (ans int) { sign := 1 for _, c := range strconv.Itoa(n) { x := int(c - '0') ans += sign * x sign *= -1 } return } -
function alternateDigitSum(n: number): number { let ans = 0; let sign = 1; while (n) { ans += (n % 10) * sign; sign = -sign; n = Math.floor(n / 10); } return ans * -sign; } -
impl Solution { pub fn alternate_digit_sum(mut n: i32) -> i32 { let mut ans = 0; let mut sign = 1; while n != 0 { ans += (n % 10) * sign; sign = -sign; n /= 10; } ans * -sign } } // Solution 2 impl Solution { pub fn alternate_digit_sum(n: i32) -> i32 { let mut ans = 0; let mut sign = 1; for c in format!("{}", n).chars() { let x = c.to_digit(10).unwrap() as i32; ans += x * sign; sign *= -1; } ans } } -
int alternateDigitSum(int n) { int ans = 0; int sign = 1; while (n) { ans += (n % 10) * sign; sign = -sign; n /= 10; } return ans * -sign; }