1012 数字分类 (20分)

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

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

输入格式:

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

输出格式:

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

若其中某一类数字不存在,则在相应位置输出 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);
}
}