首页 开云体育 关于开云 开云资讯 开云滚球 开云盘口 2026世界杯 开云app下载
  • 首页
  • 开云体育
  • 关于开云
  • 开云资讯
  • 开云滚球
  • 开云盘口
  • 2026世界杯
  • 开云app下载
  • 2026世界杯

    你的位置:开云体育官方网站 - KAIYUN > 2026世界杯 > 开云sports 2026-03-06: 出现次数能被 K 整除的元素总和。用go言语, 给定一个

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

    发布日期:2026-03-08 11:29    点击次数:123

    开云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]++

    {jz:field.toptypename/}

    }

    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助力您的往时发展。