Easy
题目描述
给定一个整数数组 nums 和一个整数 k。
返回数组中所有频率能被 k 整除的元素的和,如果没有这样的元素则返回 0。
注意:如果一个元素的总频率能被 k 整除,则该元素在和中恰好包含其在数组中出现的次数。
示例 1:
输入:nums = [1,2,2,3,3,3,3,4], k = 2
输出:16
解释:
- 数字 1 出现 1 次(奇数频率)
- 数字 2 出现 2 次(偶数频率)
- 数字 3 出现 4 次(偶数频率)
- 数字 4 出现 1 次(奇数频率)
因此,总和为 2 + 2 + 3 + 3 + 3 + 3 = 16。
示例 2:
输入:nums = [1,2,3,4,5], k = 2
输出:0
解释:
没有元素出现偶数次,所以总和为 0。
示例 3:
输入:nums = [4,4,4,1,2,3], k = 3
输出:12
解释:
- 数字 1 出现 1 次
- 数字 2 出现 1 次
- 数字 3 出现 1 次
- 数字 4 出现 3 次
因此,总和为 4 + 4 + 4 = 12。
约束条件:
1 <= nums.length <= 1001 <= nums[i] <= 1001 <= k <= 100
解题思路
这是一个简单的哈希表计数问题。解题思路如下:
核心思路:
- 统计每个元素在数组中的出现频率
- 检查每个元素的频率是否能被 k 整除
- 如果能整除,则将该元素的所有出现次数都加入结果
具体步骤:
- 使用哈希表记录每个数字的出现次数
- 遍历哈希表,对于每个数字,检查其频率是否能被 k 整除
- 如果能整除,将
数字值 × 出现次数加入总和 - 返回最终的总和
时间复杂度分析:
- 第一次遍历数组统计频率:O(n)
- 遍历哈希表计算结果:O(m),其中 m 是不同元素的个数
- 总体时间复杂度:O(n)
这是一个直接按题意模拟的问题,实现简单明了。
代码实现
class Solution {
public:
int sumDivisibleByK(vector<int>& nums, int k) {
unordered_map<int, int> freq;
// 统计每个元素的频率
for (int num : nums) {
freq[num]++;
}
int result = 0;
// 检查频率是否能被k整除
for (auto& pair : freq) {
int num = pair.first;
int count = pair.second;
if (count % k == 0) {
result += num * count;
}
}
return result;
}
};
class Solution:
def sumDivisibleByK(self, nums: List[int], k: int) -> int:
from collections import Counter
# 统计每个元素的频率
freq = Counter(nums)
result = 0
# 检查频率是否能被k整除
for num, count in freq.items():
if count % k == 0:
result += num * count
return result
public class Solution {
public int SumDivisibleByK(int[] nums, int k) {
Dictionary<int, int> freq = new Dictionary<int, int>();
// 统计每个元素的频率
foreach (int num in nums) {
freq[num] = freq.GetValueOrDefault(num, 0) + 1;
}
int result = 0;
// 检查频率是否能被k整除
foreach (var pair in freq) {
int num = pair.Key;
int count = pair.Value;
if (count % k == 0) {
result += num * count;
}
}
return result;
}
}
var sumDivisibleByK = function(nums, k) {
const freq = {};
for (const num of nums) {
freq[num] = (freq[num] || 0) + 1;
}
let sum = 0;
for (const num in freq) {
if (freq[num] % k === 0) {
sum += num * freq[num];
}
}
return sum;
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 哈希表计数 | O(n) | O(m) |
其中 n 是数组长度,m 是不同元素的个数(最坏情况下 m = n)。