1012 数字分类 (20分) PAT Java代码实现

1012 数字分类 (20分)

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

A​1​​ = 能被 5 整除的数字中所有偶数的和;
A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n​1​​ −n​2​​ +n​3​​ −n​4​ ⋯;
A​3​​ = 被 5 除后余 2 的数字的个数;
A​4​​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
A​5​​ = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A​1​​ ~A​5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出 N。

输入样例 1:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例 1:

30 11 2 9.7 9

输入样例 2:

8 1 2 4 5 6 7 9 16

输出样例 2:

N 11 2 N 9

解题思路:

题目意思简单易懂,考察点在与输出格式和中间处理过程。此处我取巧用了java8的语法来减少了中间的处理过程。但是内存占用会变大。
也可以用数组来存储筛选出的数据,或者一遍遍历直接筛选出这五种情况下的数据。
具体逻辑看代码里的注释。

代码实现:

Java8语法 stream lambda表达式

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
      public static void main(String[] args) {
        //读取输入
        Scanner sc = new Scanner(System.in);
        //读入数字的数量
        int number = sc.nextInt();
        //存储读入的所有的数字
        List<Integer>  list = new ArrayList<>();
        for(int x = 0;x < number; x++){
            list.add(sc.nextInt());
        }
        sc.close();
        // 能被 5 整除的数字中的偶数
        int a1 = 0;
        List<Integer> temListA1 = list.stream().filter(item -> item % 5 == 0 && item % 2 == 0).collect(Collectors.toList());
        //能被 5 整除的数字中所有偶数的和  如果存在才求和
        if(temListA1.size() > 0){
            a1 = list.stream().filter(item -> item % 5 == 0 && item % 2 == 0).mapToInt(item -> item).sum();
        }
        //将被 5 除后余 1 的数字
        List<Integer> tempListA2 = list.stream().filter(item -> item % 5 == 1).collect(Collectors.toList());
        int a2 = 0;
        //控制交错求和 
        int flag = 1;
        //存在数字则交替求和
        if(tempListA2.size() > 0){
            for(int x : tempListA2){
                a2 += x*flag;
                flag = -flag;
            }
        }
        // 被 5 除后余 2 的数字的个数 a3为零说明不存在 则输出 N
        int a3 = (int) list.stream().filter(item -> item % 5 == 2).count();        
        
        //被 5 除后余 3 的数字
        List<Integer> tempListA4 = list.stream().filter(item -> item % 5 == 3).collect(Collectors.toList());
        //求和
        int sum = tempListA4.stream().mapToInt(item -> item).sum();
        double a4 = 0.0;
        //求平均数
        if(tempListA4.size() > 0){
            a4 = (double)sum / tempListA4.size();
        }

        //被 5 除后余 4 的数字
        List<Integer> tempListA5 = list.stream().filter(item -> item % 5 == 4).collect(Collectors.toList());
        int a5 = 0;
        //遍历找最大数字
        if(tempListA5.size() > 0){
            for(int x : tempListA5){
                a5 = Math.max(x, a5);
            }
        }
        //若数字不存在则输出N  三目运算符来控制输出
        System.out.print((temListA1.size() == 0 ? "N" : a1) + " ");
        System.out.print((tempListA2.size() == 0 ? "N" : a2) + " ");
        System.out.print((a3 == 0 ? "N" : a3) + " ");
        //精确到小数点后 1 位
        System.out.print((tempListA4.size() == 0? "N" : String.format("%.1f",a4)) + " ");
        System.out.print(tempListA5.size()  == 0? "N" : a5);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值