统计班级中的说谎者丨豆包MarsCode AI刷题

84 阅读6分钟

使用豆包MarsCode AI刷题平台解决学生说谎问题的学习方法和心得

题目解析:理清思路,深入理解

问题描述: 在小C的班级里,有 N 个学生,每个学生的成绩是 A_i。小C发现了一件有趣的事:当且仅当某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。

现在,小C想知道班里有多少个学生会说谎。

解析思路:

数据结构选择

  1. 计数数组:我们可以使用一个计数数组 counts 来记录每个分数的学生数量。由于分数范围是0到100,因此计数数组的大小为101(从0到100)。
  2. 前缀和数组:为了快速计算小于等于某个分数的学生数量,我们可以使用一个前缀和数组 prefixSums。前缀和数组的大小为102(从0到101),其中 prefixSums[i] 表示分数小于等于 i-1 的学生数量。

算法步骤

  1. 初始化计数数组:遍历所有学生的成绩,统计每个分数的学生数量。
  2. 计算前缀和:根据计数数组计算前缀和数组,prefixSums[i] 表示分数小于等于 i-1 的学生数量。
  3. 判断说谎学生:遍历每个学生的成绩,使用前缀和数组判断该学生是否说谎。具体判断条件是:prefixSums[score + 1] > n - prefixSums[score + 1],其中 n 是学生总数。
  4. 统计说谎学生数量:如果某个学生说谎,则增加说谎学生数量。
  5. 代码实现
    • 使用一个辅助数组 count 来统计每个分数的学生数量。
    • 遍历数组 A,统计每个分数的学生数量。
    • 再次遍历数组 A,对于每个成绩,计算小于等于该成绩的学生数量 less,以及大于该成绩的学生数量 greater
    • 判断 less > greater,如果是,则该学生说谎,统计说谎的学生总数。

代码(Java):

public class Main {
    public static int solution(int[] A) {
        // Edit your code here
        int n = A.length;

        int[] counts = new int[101]; // 用于记录每个分数的学生数量,最大分数为100
        for (int score : A) {
            counts[score]++;
        }
        int[] prefixSums = new int[102]; // 前缀和数组,用于快速计算小于等于某个分数的学生数量
        for (int i = 0; i < 101; i++) {
            prefixSums[i + 1] = prefixSums[i] + counts[i];
        }
        int liars = 0; // 记录说谎的学生数量
        for (int score : A) {
            if (prefixSums[score + 1] > n - prefixSums[score + 1]) {
                liars++;
            }
        }
        return liars;
    }
    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution(new int[]{100, 100, 100}) == 3);
        System.out.println(solution(new int[]{2, 1, 3}) == 2);
        System.out.println(solution(new int[]{30, 1, 30, 30}) == 3);
        System.out.println(solution(new int[]{19, 27, 73, 55, 88}) == 3);
        System.out.println(solution(new int[]{19, 27, 73, 55, 88, 88, 2, 17, 22}) == 5);
    }
}

代码解释:

solution 方法

这个方法是用来解决问题的核心逻辑。它接收一个整数数组 A,表示学生的成绩,并返回一个整数,表示说谎的学生数量。

main 方法

这个方法是用来测试 solution 方法的。它包含了一些测试用例,并打印出测试结果。

代码详细解释

1. 初始化变量

int n = A.length;
int[] counts = new int[101]; // 用于记录每个分数的学生数量,最大分数为100
  • n 是学生总数。
  • counts 是一个大小为101的数组,用于记录每个分数的学生数量。由于分数范围是0到100,所以数组大小为101。

2. 统计每个分数的学生数量

for (int score : A) {
    counts[score]++;
}
  • 遍历数组 A,统计每个分数的学生数量,并存储在 counts 数组中。

3. 计算前缀和

int[] prefixSums = new int[102]; // 前缀和数组,用于快速计算小于等于某个分数的学生数量
for (int i = 0; i < 101; i++) {
    prefixSums[i + 1] = prefixSums[i] + counts[i];
}
  • prefixSums 是一个大小为102的数组,用于存储前缀和。prefixSums[i] 表示分数小于等于 i-1 的学生数量。
  • 通过遍历 counts 数组,计算前缀和数组 prefixSums

4. 判断说谎学生

int liars = 0; // 记录说谎的学生数量
for (int score : A) {
    if (prefixSums[score + 1] > n - prefixSums[score + 1]) {
        liars++;
    }
}
  • liars 用于记录说谎的学生数量。
  • 遍历每个学生的成绩,使用前缀和数组 prefixSums 判断该学生是否说谎。具体判断条件是:prefixSums[score + 1] > n - prefixSums[score + 1],即分数小于等于 score 的学生数量大于班级总人数的一半。

5. 返回结果

return liars;
  • 返回说谎的学生数量。

测试用例

public static void main(String[] args) {
    // Add your test cases here
    System.out.println(solution(new int[]{100, 100, 100}) == 3);
    System.out.println(solution(new int[]{2, 1, 3}) == 2);
    System.out.println(solution(new int[]{30, 1, 30, 30}) == 3);
    System.out.println(solution(new int[]{19, 27, 73, 55, 88}) == 3);
    System.out.println(solution(new int[]{19, 27, 73, 55, 88, 88, 2, 17, 22}) == 5);
}

学习计划:制定计划,循序渐进

刷题需要坚持和计划,不能三天打鱼两天晒网。以下是我总结的高效学习计划:

  1. 制定目标

    • 设定一个明确的刷题目标,例如,每天刷5道题,或者每周掌握一个新的算法。
    • 将目标分解成具体的任务,例如,今天要刷哪些题目,要学习哪些知识点。
  2. 合理安排时间

    • 每天安排固定的时间段进行刷题,例如,早上起床后或者晚上睡觉前。
    • 避免长时间连续刷题,可以每刷1-2小时休息10-15分钟,保持良好的学习状态。
  3. 利用错题

    • 将做错的题目整理出来,分析错误原因,并记录下来。
    • 定期回顾错题,确保自己真正理解和掌握这些知识点。

工具运用:结合AI,提升效率

豆包MarsCode AI刷题平台提供了强大的AI功能,可以帮助我们更高效地学习:

  1. 智能提示

    • 在做题过程中,AI可以提供智能提示,帮助我们理清思路。例如,当我们遇到难题时,AI可以给出一些解题思路或者提示代码片段。
  2. 代码优化

    • AI可以帮助我们优化代码,提高代码质量和运行效率。例如,AI可以检测代码中的冗余代码,并给出优化建议。
  3. 学习资源

    • AI可以推荐相关的学习资源,例如,相关的教程、博客或者视频,帮助我们更深入地理解知识点。

总结

使用豆包MarsCode AI刷题平台进行学习,是一个循序渐进的过程。通过合理的题目解析、知识总结、学习计划和工具运用,我们可以更高效地提升编程能力。希望本文分享的学习方法和心得,能够对大家有所帮助。刷题不仅仅是完成任务,更重要的是从中学习到新的知识和技能。