leetcode
leetcode 2201 ~ 2250
交替数字和

交替数字和

难度:

标签:

题目描述

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

 

代码结果

运行时间: 20 ms, 内存: 16.5 MB


/*
题目思路:
1. 将输入的整数 n 转换为字符串以方便逐位处理。
2. 使用 IntStream 进行流式处理,通过 map 和 reduce 操作实现累加和计算。
3. 根据索引确定符号并计算累加和。
4. 返回最终结果。
*/

import java.util.stream.IntStream;

public class Solution {
    public int alternateDigitSum(int n) {
        // 将输入的整数转换为字符串
        String number = String.valueOf(n);
        // 使用 IntStream 进行流式处理
        return IntStream.range(0, number.length())
                .map(i -> {
                    // 获取当前位的数字
                    int digit = Character.getNumericValue(number.charAt(i));
                    // 根据索引确定符号并计算累加和
                    return (i % 2 == 0) ? digit : -digit;
                })
                .sum(); // 计算最终累加和
    }
}

解释

方法:

此题解首先将整数 n 转换为字符串,然后转换为字符列表,以便对每个数字单独操作。遍历这个列表的奇数位置的索引(从 1 开始,即第二个元素),并在这些位置的数字前添加负号,从而符合题目要求的符号变换。然后,使用 map 函数将修改后的字符串列表中的每个元素转换回整数,并计算它们的总和。这样处理后,最高有效位保持为正,其余位按要求交替变换符号。

时间复杂度:

O(d)

空间复杂度:

O(d)

代码细节讲解

🦆
为什么将整数n转换为字符串再转换为字符列表是处理这个问题的一个有效方法?
将整数转换为字符串再转换为字符列表允许我们直接访问和操作每个数字的符号。在字符串形式中,每个数字都是独立的字符,便于在不同的位置插入符号或进行其他修改。这种方法简化了数位的直接操作,尤其是在需要对特定位置的数字进行符号变更时。直接在整数上操作每位数字的符号会更复杂,因为涉及到位操作和数位的分离,这在某些编程环境中可能不是直观的。
🦆
题解中的for循环`for i in range(1, le_n, 2)`是如何确保只有从第二位开始的数字前加负号,而保持最高有效位正号的?
在题解中,`for i in range(1, le_n, 2)`循环的开始索引是1,这表示循环从字符串的第二个字符开始执行。索引1对应数字的第二位。因此,循环在每个迭代中跳过一位,从第二位开始,然后是第四位,第六位,依此类推,为这些位置的数字前添加负号。由于循环的起始索引是1,最高有效位(即字符串的第一个字符,索引0)不会被循环处理,保持其原符号(通常是正号)。
🦆
是否存在更高效的方法直接在整数上操作,而不通过转换为字符串和字符列表来解决这个问题?
虽然可以通过使用数学方法直接在整数上操作来解决这个问题,例如通过循环提取每位数字,然后根据其位置确定是添加到总和还是从总和中减去,但这样的方法通常需要更多的数学计算,如使用除法和模运算来不断地分解整数。这种方法虽然可以避免字符串转换的开销,但其代码实现可能更为复杂,而且在可读性和易于调试方面可能不如操作字符串直观。总体来说,直接操作整数的方法可能在执行效率上略有优势,但在实现和维护上可能更复杂。
🦆
在处理特殊情况,如数字连续相同(例如输入为1111)时,这种方法处理的结果是否仍然符合预期?
是的,即使在所有数字都相同的情况下,例如1111,这种方法仍然有效。按照题解的方法,第二位和第四位数字前会添加负号,变成1-1+1-1。这种情况下的结果是0,符合预期的处理逻辑。这个方法是基于数字的位置来添加负号的,而与数字的具体值无关,因此即使是连续相同的数字也能正确处理。

相关问题