Easy
题目描述
给你一个整数数组 nums。
nums 的交替和是通过将偶数索引处的元素相加,奇数索引处的元素相减得到的值。也就是说,nums[0] - nums[1] + nums[2] - nums[3]...
返回表示 nums 交替和的整数。
示例 1:
输入: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。
示例 2:
输入:nums = [100]
输出:100
解释:
偶数索引处唯一的元素是 nums[0] = 100,因为 0 是偶数。
没有奇数索引处的元素。
交替和为 nums[0] = 100。
提示:
1 <= nums.length <= 1001 <= nums[i] <= 100
解题思路
这道题目要求计算数组的交替和,即偶数索引的元素为正号,奇数索引的元素为负号。
解法分析:
- 直接遍历法(推荐):遍历数组,根据索引的奇偶性决定加减操作
- 符号控制法:使用一个符号变量,每次遍历后翻转符号
解题思路:
最直观的方法是遍历整个数组,对于每个位置判断索引是否为偶数。如果是偶数索引,将该元素加到结果中;如果是奇数索引,从结果中减去该元素。
另一种更简洁的思路是使用符号控制。初始化符号为 1,每次将当前元素乘以符号后加到结果中,然后将符号取反。这样可以避免每次都判断索引的奇偶性。
由于数组长度最大为 100,元素值最大为 100,所以不用担心整数溢出问题。时间复杂度为 O(n),空间复杂度为 O(1),效率很高。
代码实现
class Solution {
public:
int alternatingSum(vector<int>& nums) {
int sum = 0;
int sign = 1;
for (int num : nums) {
sum += sign * num;
sign = -sign;
}
return sum;
}
};
class Solution:
def alternatingSum(self, nums: List[int]) -> int:
sum_val = 0
sign = 1
for num in nums:
sum_val += sign * num
sign = -sign
return sum_val
public class Solution {
public int AlternatingSum(int[] nums) {
int sum = 0;
int sign = 1;
foreach (int num in nums) {
sum += sign * num;
sign = -sign;
}
return sum;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var alternatingSum = function(nums) {
let sum = 0;
let sign = 1;
for (let num of nums) {
sum += sign * num;
sign = -sign;
}
return sum;
};
复杂度分析
| 复杂度 | 大O表示法 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历数组一次,n为数组长度 |
| 空间复杂度 | O(1) | 只使用了常数个额外变量 |
相关题目
- . Alternating Digit Sum (Easy)