学习指引
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、【例题1】
1、题目描述
给定整数 ,和 个正整数,请你输出它们的平均值,如果为整数则直接输出,小数则保留位小数。。
2、解题思路
求平均数那我们需要先统计所有数字之和sum
,然后去判断sum
是否能整除n
。如果可以则直接得到平均值 ,为整型。否则应该为浮点数类型。
3、模板代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//统计总和
int res = 0;
for (int i = 0; i < n; i++) {
res += sc.nextInt();
}
if (res % n == 0) System.out.println(res / n);
else {
double x = res * 1.0 / n;
System.out.printf("%.3f", x);
}
}
}
4、代码解析
-
res
用来统计每个数的和,当res%n==0
说明res
是n
的倍数,我们可以直接整除得到答案 - 计算
x
时,需要先乘一个浮点数1.0
,将被除数转化为浮点数类型,否则两个整数相除会产生精度损失。比如5
除以2
会得到2.000
,而5.0
除以2
则不会产生该问题,答案会是2.500
。
二、【例题2】
1、题目描述
给定整数 ,和 个正整数,请你输出它们的平均值,如果为整数则直接输出,小数则保留位小数。。
2、解题思路
咋一看,与上一题一致,但我们应该仔细考虑数据范围,n
的范围是1e5
,而每个数的值区间是。当n
取最大,且每个数都取极值的情况下,总和res
的取值范围是。这已经超出了int
类型的取值范围了,为了防止出错,我们需要使用更大的long
类型。
3、模板代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//统计总和
long res = 0;
for (int i = 0; i < n; i++) {
res += sc.nextInt();
}
if (res % n == 0) System.out.println(res / n);
else {
double x = res * 1.0 / n;
System.out.printf("%.3f", x);
}
}
}
4、代码解析
- 思路与前面一致,只要在于发现可能爆
int
的问题,转而使用long
存储总和。