2026-02-27:计算交替和。用go语言,给定一个整数数组 nums,定义其交替和为:把所有下标为偶数的元素相加,再减去所有下标为奇数的元素。等价于计算 Σ_{i=0}^{n-1} (-1)^i * nums[i]。返回这个交替和的值。
1 <= nums.length <= 100。
1 <= nums[i] <= 100。
输入: nums = [1,3,5,7]。
输出: -4。
解释:
偶数下标位置的元素是 nums[0] = 1 和 nums[2] = 5,因为 0 和 2 是偶数。
奇数下标位置的元素是 nums[1] = 3 和 nums[3] = 7,因为 1 和 3 是奇数。
交替和为 nums[0] - nums[1] + nums[2] - nums[3] = 1 - 3 + 5 - 7 = -4。
题目来自力扣3701。
一、核心规则与公式转化
首先明确题目中“交替和”的定义:
- 数学公式:交替和 =
nums[0] - nums[1] + nums[2] - nums[3] + ... + (-1)^i * nums[i](i为元素下标); - 代码中的简化逻辑:
x * (1 - i%2*2)是对(-1)^i * x的等价变形,我们可以验证:- 当i为偶数(i%2=0):
1 - 0*2 = 1→ 等价于乘以+1; - 当i为奇数(i%2=1):
1 - 1*2 = -1→ 等价于乘以-1。 这一变形避免了使用幂运算,更高效且易计算。
- 当i为偶数(i%2=0):
以输入 nums = [1,3,5,7] 为例,交替和计算为 1 - 3 + 5 - 7 = -4,与题目输出一致。
二、代码执行过程分步解析(以nums = [1,3,5,7]为例)
步骤1:初始化结果变量
函数 alternatingSum 首先初始化返回值 ans 为0,用于累加最终的交替和。此时 ans = 0。
步骤2:遍历数组并计算交替和(核心逻辑)
代码通过 for i, x := range nums 遍历数组的每个元素,其中:
i是元素的下标(从0开始);x是下标i对应的数组元素值;- 每次循环将
x * (1 - i%2*2)累加到ans中。
我们逐次拆解循环过程:
| 循环次数 | 下标i | 元素x | i%2 | 计算因子(1 - i%2*2) | 本次累加值(x×因子) | ans更新后的值 |
|---|---|---|---|---|---|---|
| 第1次 | 0 | 1 | 0 | 1 - 0×2 = 1 | 1×1 = 1 | 0 + 1 = 1 |
| 第2次 | 1 | 3 | 1 | 1 - 1×2 = -1 | 3×(-1) = -3 | 1 - 3 = -2 |
| 第3次 | 2 | 5 | 0 | 1 - 0×2 = 1 | 5×1 = 5 | -2 + 5 = 3 |
| 第4次 | 3 | 7 | 1 | 1 - 1×2 = -1 | 7×(-1) = -7 | 3 - 7 = -4 |
步骤3:返回最终结果
遍历结束后,ans 的值为-4,函数将其返回。main函数接收结果并打印,输出为-4,符合题目要求。
三、时间复杂度与空间复杂度分析
1. 时间复杂度
- 遍历数组:代码仅需一次遍历数组的所有元素,数组长度为n(本例中n=4),遍历次数为n次;
- 单次循环操作:每次循环仅涉及“取模、乘法、加法”等常数级操作(O(1));
- 总时间复杂度:O(n) × O(1) = O(n)(线性时间); 结合题目约束(n≤100),计算量极小,性能无任何问题。
2. 额外空间复杂度
- 变量开销:仅使用了
ans、i、x三个整型变量,没有创建额外的数组、切片或其他数据结构; - 数组本身:代码直接使用输入的
nums切片,没有复制或新建,不属于“额外空间”; - 总额外空间复杂度:O(1)(常数空间),不随数组长度变化。
总结
- 核心过程:先初始化结果为0,再遍历数组的每个元素,根据下标奇偶性给元素乘以+1或-1,累加所有结果得到交替和;
- 时间复杂度:O(n)(仅需一次线性遍历数组,单次循环为常数操作);
- 额外空间复杂度:O(1)(仅使用固定数量的临时变量,无额外数据结构开销)。
Go完整代码如下:
package main
import (
"fmt"
)
func alternatingSum(nums []int) (ans int) {
for i, x := range nums {
ans += x * (1 - i%2*2)
}
return
}
func main() {
nums := []int{1, 3, 5, 7}
result := alternatingSum(nums)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def alternatingSum(nums):
ans = 0
for i, x in enumerate(nums):
# i%2*2 计算:当i为偶数时结果为0,当i为奇数时结果为2
# 1 - i%2*2 计算:当i为偶数时结果为1,当i为奇数时结果为-1
ans += x * (1 - (i % 2) * 2)
return ans
def main():
nums = [1, 3, 5, 7]
result = alternatingSum(nums)
print(result)
if __name__ == "__main__":
main()
C++完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
int alternatingSum(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
int x = nums[i];
// i%2*2 计算:当i为偶数时结果为0,当i为奇数时结果为2
// 1 - i%2*2 计算:当i为偶数时结果为1,当i为奇数时结果为-1
ans += x * (1 - (i % 2) * 2);
}
return ans;
}
int main() {
vector<int> nums = {1, 3, 5, 7};
int result = alternatingSum(nums);
cout << result << endl;
return 0;
}