开云sports 2026-03-06: 出现次数能被 K 整除的元素总和。用go言语, 给定一个

2026-03-06:出现次数能被 K 整除的元素总和。用go言语,给定一个整数数组 nums 和整数 k,求出数组中那些出现次数能被 k 整除的元素所孝敬的总和。具体作念法是先统计每个不同元素在数组中出现的次数;若某个元素的出现次数 c 自尊 c % k == 0,则把该元素的值按其出现次数累加进适度(即加上 value * c)。要是莫得任何元素自尊该要求,则复返 0。
1
1
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。
题目来独力扣3712。
一、需求颐养
你但愿我基于提供的Go言语代码,注意拆解“出现次数能被 K 整除的元素总和”问题的措置过程,并分析那时辰复杂度和空间复杂度。中枢方针是:统计数组中每个元素的出现次数,仅将出现次数能被k整除的元素按其出现次数累加,最终复返这个总和。
二、解题过程分步融会
悉数这个词算法的逻辑特地直不雅,中枢是“统计频次 → 筛选要求 → 累加计较”,具肉风光如下:
模式1:开动化频次统计容器
率先创建一个空的哈希映射(字典)cnt,键是数组中的元素值,值是该元素在数组中出现的次数。这个容器的作用是高效统计每个不同元素的出现次数,幸免重迭遍历数组。
模式2:遍历数组,统计每个元素的出现次数
一一遍历输入数组nums中的每一个元素x:
• 关于现时元素x,检讨它是否照旧在哈希映射cnt中:
要是存在:将cnt[x]的值加1(暗示该元素又出现了一次);
要是不存在:在cnt中新增键值对x: 1(暗示该元素初度出现)。
• 以输入用例nums = [1,2,2,3,3,3,3,4]为例:
遍历到1:cnt[1] = 1;
遍历到第一个2:cnt[2] = 1,遍历到第二个2:cnt[2] = 2;
遍历到4个3:cnt[3]从1逐渐加多到4;
遍历到4:cnt[4] = 1;
最终cnt的骨子为:{1:1, 2:2, 3:4, 4:1}。
模式3:遍历频次映射,筛选并累加相宜要求的元素总和
开动化适度变量ans为0,然后遍历哈希映射cnt中的每一个键值对(键为元素值x,值为出现次数c):
• 检讨现时元素的出现次数c是否自尊c % k == 0(即能被k整除):
要是自尊:将x * c加到ans中(比如元素2出现2次,k=2,2%2=0,是以加22=4;元素3出现4次,4%2=0,是以加34=12);
要是不自尊:跳过该元素(比如元素1出现1次,1%2≠0;元素4出现1次,kaiyun sports1%2≠0,均跳过)。
• 以输入用例为例:
处理1: c=1,1%2≠0 → 跳过;
处理2: c=2,2%2=0 → ans += 2*2 → ans=4;
处理3: c=4,4%2=0 → ans += 3*4 → ans=16;
处理4: c=1,1%2≠0 → 跳过;
最终ans的值为16,相宜题目输出要求。
模式4:复返最终适度
遍历完悉数键值对后,复返ans算作最终适度。要是莫得任何元素自尊要求(比如悉数元素出现次数齐弗成被k整除),则ans保握开动值0,相宜题目要求。
三、时辰复杂度与空间复杂度分析
1. 时辰复杂度
• 模式2(统计频次):遍历数组nums的悉数元素,数组长度为n,因此时辰复杂度为O(n);
• 模式3(筛选累加):遍历哈希映射cnt的悉数键值对,cnt的键的数目最多为n(当数组中悉数元素齐不同期),因此时辰复杂度为O(n);
• 其他模式(开动化、复返适度):时辰复杂度为O(1);
• 总时辰复杂度:O(n)(n为数组nums的长度),因为O(n) + O(n) = O(n)。
2. 出奇空间复杂度
• 哈希映射cnt:用于存储元素的出现次数,空间占用取决于数组中不同元素的数目,最坏情况下(悉数元素齐不同)占用O(n)的空间;
• 其他变量(如ans、轮回变量x/c等):占用O(1)的固定空间;
• 总数外空间复杂度:O(n)(最坏情况),最优情况(数组中悉数元素齐疏导)为O(1)。
追思
1. 中枢历程:先通过哈希映射统计每个元素的出现次数,再遍历映射筛选出次数能被k整除的元素,按“元素值×出现次数”累加得到总和;
2. 要津操作:哈希映射的频次统计是中枢,保证了高效的频次查询和更新;
3. 复杂度:时辰复杂度为O(n)(n为数组长度),出奇空间复杂度最坏为O(n)、最优为O(1)。
Go无缺代码如下:
package main
import (
"fmt"
)
func sumDivisibleByK(nums []int, k int) (ans int) {
cnt := map[int]int{}
for _, x := range nums {
cnt[x]++
}
for x, c := range cnt {
if c%k == 0 {
ans += x * c
}
}
return
}
func main {
nums := []int{1, 2, 2, 3, 3, 3, 3, 4}
k := 2
result := sumDivisibleByK(nums, k)
fmt.Println(result)
}

Python无缺代码如下:
# -*-coding:utf-8-*-
def sum_divisible_by_k(nums, k):
"""
计较数组中出现次数能被k整除的元素与其出现次数的乘积之和
Args:
nums: 整数数组
k: 除数
Returns:
相宜要求的元素值乘以出现次数的总和
"""
# 统计每个数字出现的次数
cnt = {}
for x in nums:
cnt[x] = cnt.get(x, 0) + 1
ans = 0
# 遍历统计适度
for x, c in cnt.items:
if c % k == 0: # 要是出现次数能被k整除
ans += x * c
return ans
def main:
nums = [1, 2, 2, 3, 3, 3, 3, 4]
k = 2
result = sum_divisible_by_k(nums, k)
print(result)
if __name__ == "__main__":
main

C++无缺代码如下:
#include
#include
#include
using namespace std;
/**
* 计较数组中出现次数能被k整除的元素与其出现次数的乘积之和
*
* @param nums 整数数组
* @param k 除数
* @return 相宜要求的元素值乘以出现次数的总和
*/
int sumDivisibleByK(const vector& nums, int k) {
// 统计每个数字出现的次数
unordered_map cnt;
for (int x : nums) {
cnt[x]++;
}
int ans = 0;
// 遍历统计适度
for (const auto& pair : cnt) {
int x = pair.first;
int c = pair.second;
if (c % k == 0) { // 要是出现次数能被k整除
ans += x * c;
}
}
return ans;
}
int main {
vector nums = {1, 2, 2, 3, 3, 3, 3, 4};
int k = 2;
{jz:field.toptypename/}int result = sumDivisibleByK(nums, k);
cout
return0;
}

咱们服气东说念主工智能为泛泛东说念主提供了一种“增强器具”,并奋勉于于共享全方向的AI常识。在这里,您不错找到最新的AI科普著述、器具评测、提高后果的隐秘以及行业知悉。
接待眷注“福大大架构师逐日一题”,发音问可获取口试贵寓,让AI助力您的往时发展。

备案号: