LeetCode算法,多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。 多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的....

多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。
多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的。
现在多多鸡想请你帮忙计算一下,满足和谐条件的区间的数量。

在这里插入图片描述

 public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int[] A = new int[N];
        for(int i = 0; i < N; i++){
            A[i] = scanner.nextInt();
        }
        int count = 0;
        int sum = 0;
        Map<Integer, Integer> record = new HashMap<>();
        //遍历数组nums之前,record提前放入 0:1 键值对,代表求第 0 项前缀和之前,前缀和 mod K 等于 0 这种情况出现了 1 次。
        record.put(0,1);
        for(int elem : A){
            sum+=elem;//前缀和
            int model = (sum % M + M) % M;//取余数
            //getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值0。
            record.put(model, record.getOrDefault(model, 0)+1);
        }
        //values() 方法返回映射中所有 value 组成的 Set 视图
        for(int n : record.values()){
            count+=n*(n-1)/2;
        }
        //for(Map.Entry<Integer, Integer> entry : record.entrySet()){
        //    count+=entry.getValue()*(entry.getValue()-1)/2;
        //}
        System.out.println(count);
    }

对于这个计算的方式
计算前n个数进行求和然后取余 计入Map

for(int elem : A){
            sum+=elem;//前缀和   
            int model = (sum % M + M) % M;//取余数
            //getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值0。
            record.put(model, record.getOrDefault(model, 0)+1);
        }

举个栗子:
输入5个数 M为3 也就是求这5颗数的和谐值对3能不能整除 求出能整除的组合
我输入 3 4 5 6 7 然后M输入3
分析:第一棵树和谐值为3 第二棵树和谐值为3+4=7 依次为:12,、18、25
计算:

每棵树对3求余数

余数
树0(代表0项 余数为0已经出现了一次)0
树10
树21
树30
树40
树51

由我们上图自己计算的结果:
相同余数的前缀区间任选两个所构成的中间区间一定和谐(因为大的那个前缀区间求和减去小的前缀区间求和,刚好把那个多出来的余数减掉了,因此中间区间求和一定能被m整除)

所以:
在这里插入图片描述
共有7个区间

在这里插入图片描述
运行验证是正确的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,那么我们可以先输入这些整数,然后计算它们的平均,最后再遍历一遍整个数组统计大于平均的个数。以下是示例代码: ```python nums = input("请输入若干个整数,以空格分隔:").split() nums = [int(num) for num in nums] # 将输入的字符串转换为整数列表 avg = sum(nums) / len(nums) # 计算平均 count = 0 # 统计大于平均的个数 for num in nums: if num > avg: count += 1 print("大于平均的数据的个数为:", count) ``` 这里使用了 Python 的内置函数 `input()` 和 `split()` 来获取输入的整数列表,使用了列表推导式将输入的字符串列表转换为整数列表。然后通过遍历整个列表,统计大于平均的数据个数。 ### 回答2: 首先,我们需要计算输入的整数的平均。可以通过将输入的整数相加,然后除以整数的个数来得到平均。 接下来,可以遍历每个输入的整数,判断该整数是否大于平均。如果是,则将计数器加1。 最后,输出计数器的即为大于平均的数据的个数。 以下是具体的实现代码: ```python def count_greater_than_average(nums): # 计算整数的平均 average = sum(nums) / len(nums) # 计数器 count = 0 # 遍历每个整数 for num in nums: # 判断是否大于平均 if num > average: count += 1 return count # 输入测试用例 nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 调用函数并输出结果 result = count_greater_than_average(nums) print("大于平均的数据的个数为:", result) ``` 以上代码将输出:大于平均的数据的个数为: 5 ### 回答3: 首先,我们需要按照题目要求输入一些整数。假设输入的整数个数为n,那么我们可以创建一个长度为n的整数数组来保存这些整数。 接下来,我们需要计算这些整数的平均。我们可以使用一个循环来遍历整数数组,将每个整数累加到一个变量中。最后,将该变量除以整数个数n即可得到平均。 然后,我们可以再次使用一个循环来遍历整数数组,判断每个整数是否大于平均。如果是,我们就计数器加1,表示该整数大于平均。 最后,我们将计数器的输出即可,即为大于平均的数据的个数。 下面是相应的代码示例: ```python n = int(input("请输入整数的个数:")) arr = [] sum = 0 for i in range(n): num = int(input("请输入第{}个整数:".format(i+1))) arr.append(num) sum += num average = sum / n count = 0 for i in range(n): if arr[i] > average: count += 1 print("大于平均的数据个数为:", count) ``` 这样,我们就可以根据输入的整数,输出大于平均的数据的个数了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杵意

谢谢金主打赏呀!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值