交替数字和
难度:
标签:
题目描述
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)`是如何确保只有从第二位开始的数字前加负号,而保持最高有效位正号的?
▷🦆
是否存在更高效的方法直接在整数上操作,而不通过转换为字符串和字符列表来解决这个问题?
▷🦆
在处理特殊情况,如数字连续相同(例如输入为1111)时,这种方法处理的结果是否仍然符合预期?
▷