分组飞行棋棋子 | 豆包MarsCode AI刷题

55 阅读3分钟
public static String solution(int[] nums) {
    // Please write your code here
    int len = nums.length;//长度
    int[] a = new int[50005];//标记数组
    int max = 0;
    int i = 0;
    int check = 1;
    for(i = 0; i < len; i++)
    {
        a[nums[i]]++;
        max = max > nums[i] ? max : nums[i];
    }
    for(i = max; i >= 0; i--)
    {
        if(a[i]%5 != 0)
        {
            check = 0;
            break;
        }
    }
    if(check == 1){return "True";}
    else{return "False";}
}

这段代码的目的是检查数组 nums 中的每个元素的频率是否都是 5 的倍数。在代码中,首先创建一个标记数组 a,来记录每个数字出现的次数,然后找出数组中的最大值。在第二个循环中,逆向检查从最大值到 0 的每个元素,确认每个元素在 a 中的计数是否都是 5 的倍数。

如果所有元素的出现次数都是 5 的倍数,函数返回 "True",否则返回 "False"

这段代码的目的是检查一个整数数组 nums 中的每个元素的出现频率,判断所有元素的出现次数是否都是 5 的倍数。如果所有元素的出现次数都是 5 的倍数,函数返回字符串 "True";否则,返回 "False"。下面是对代码的逐步解析。

代码解析

  1. 初始化变量

    int len = nums.length; // 获取数组长度
    int[] a = new int[50005]; // 创建标记数组,大小足够容纳所有可能的数组元素
    int max = 0; // 用于记录数组中的最大值
    int i = 0; // 循环索引
    int check = 1; // 用于指示是否满足条件的标志
    
  2. 记录数字出现频率

    for (i = 0; i < len; i++) {
        a[nums[i]]++; // 增加出现次数
        max = max > nums[i] ? max : nums[i]; // 更新最大值
    }
    
    • 通过遍历 nums 数组,利用数组 a 来记录每个数字的出现次数。
    • nums[i] 被访问时,a[nums[i]] 自增,表示该数字出现的次数。
    • max 用于跟踪数组中的最大元素,以便后续的检查。
  3. 检查所有数字的出现次数是否为 5 的倍数

    for (i = max; i >= 0; i--) {
        if (a[i] % 5 != 0) { // 检查当前数字的出现次数是否是 5 的倍数
            check = 0; // 如果发现有不是 5 的倍数的出现次数,将标志设置为 0
            break; // 找到一个不满足条件的数,提前结束循环
        }
    }
    
    • 从最大值 max 开始反向遍历 a 数组,检查每个元素的出现次数。
    • 其中 a[i] % 5 != 0 判断当前数字的出现次数是否为 5 的倍数。
    • 如果发现某个出现次数不是 5 的倍数,设置 check 为 0,并退出循环。
  4. 返回结果

    if (check == 1) { return "True"; }
    else { return "False"; }
    
    • 根据 check 的值决定返回 "True""False"

整体逻辑

该算法的核心是利用一个标记数组 a 来记录所有数字的出现频率,并通过简单的取模操作判断每个数字的出现次数是否满足特定条件(指这里的倍数关系)。这是一个有效的算法结构,能够以线性时间复杂度计算频率,并以常量时间复杂度检查每个元素的频率。

复杂度分析

  • 时间复杂度:O(n + m),其中 n 是输入数组的长度,m 是标记数组的大小(在本例中为 50005),因为需要遍历输入数组并检查频率数组。
  • 空间复杂度:O(m),额外开辟了一个固定大小的数组用于存储出现次数。

总结

该算法有效地检查了数组中所有元素的出现次数与 5 的倍数关系,利用标记数组的概念简化了频率统计和验证的过程。此方法对于处理大规模数据集可高效且直接。