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

95 阅读3分钟

问题描述

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

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


测试样例

样例1:

输入:A = [100, 100, 100] 输出:3

样例2:

输入:A = [2, 1, 3] 输出:2

样例3:

输入:A = [30, 1, 30, 30] 输出:3

样例4:

输入:A = [19, 27, 73, 55, 88] 输出:3

样例5:

输入:A = [19, 27, 73, 55, 88, 88, 2, 17, 22] 输出:5

算法思路

分数区间是 [0,100] ,可以创建一个大小为101的数组 count ,遍历输入数组并记录各分数的学生数量

接下来统计小于某一分数的总人数,只需得到的数组进行如下操作 count[i] = count[i - 1] + count[i]

遍历输入数组元素a,如果对应的count[a]超过总人数的一半时,对说谎人数 res 进行自增操作

Solution

 ​
 public class Main {
     public static int solution(int[] A) {
         int[] count = new int[101];
 ​
         int res = 0;
 ​
         for (int a : A) {
             count[a]++;
         }
 ​
         for (int i = 1; i < 101; i++) {
             count[i] = count[i - 1] + count[i];
         }
 ​
         for (int a : A) {
             if (count[a] > A.length / 2) {
                 res++;
             }
         }
 ​
         return res;
     }
 ​
     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作为参数,并返回说谎的学生数量。我们使用一个长度为101的数组count来记录每个分数的出现次数。然后,我们通过两层循环来完成任务:第一层循环用于填充count数组,第二层循环用于累加count数组的值。最后,我们再次遍历A数组,通过检查count[a]的值来确定哪些学生会说谎,并统计说谎的学生数量。

测试验证

main方法中添加了几个测试样例来验证我们的算法。这些测试样例覆盖了不同的输入情况,包括所有学生分数相同、分数不同以及分数分布不均等情况。通过这些测试样例,我们可以确保我们的算法能够正确地统计出说谎的学生数量。

总结

这个问题是一个典型的计数问题,通过使用额外的数组来记录分数的出现次数,我们可以有效地解决这个问题。这种方法的时间复杂度是O(N),其中N是学生的数量,因为我们需要遍历整个数组来填充和累加count数组。这种方法简单且高效,适用于处理这类计数问题。