学习指引
- 序、专栏前言
- 一、【例题1】
- 2、解题思路
- 3、模板代码
- 1、方法1
- 1、方法2
- 4 、代码解析
- 二、【例题2】
- 2、解题思路
- 3、模板代码
- 1、方法1
- 2、方法2
- 4 、代码解析
- 三、推荐专栏
- 四、课后习题
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、【例题1】
给定一个整数 ,请你输出从
的值。
2、解题思路
题目难度:⭐️
朴素的想法,肯定是循环把区间的每一个数都加上,这样的复杂度很明显是
级别。但很明显该数列是一个公差为
的等差数列,如果我们使用高中学过的等差数列前
项和公式,首项为
,公差为
的前
项和公式为:
在公差为的情况下可以优化为:
在更为特殊的公差和首项都为的情况下:
3、模板代码
1、方法1
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 = 1; i <=n; i++) {
res+=i;
}
System.out.println(res);
}
}
1、方法2
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(n*(n+1)/2);
}
}
4 、代码解析
方法
采用朴素的办法进行累加,时间复杂度达到
,复杂度过高不太可取。
方法
是直接采用等差数列的求和公式直接得到答案,时间复杂度为
。
二、【例题2】
给定多组输入数据,每次给定一个整数 ,请你输出从
的值。
2、解题思路
题目难度:⭐️
咋一看,貌似和上题没什么区别。但 的数据范围大了很多,而一道题目是否难,数据范围是一个非常重要的参考因素。在我们的等差数列求和公式中,我们先进行了
的操作,在
足够大的情况下,是有可能爆
int
,造成整数溢出变成负数,所以我们需要做出一些调整。
3、模板代码
1、方法1
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
long n=sc.nextLong();
System.out.println(n*(n+1)/2);
}
}
}
2、方法2
import java.util.Scanner;
public class test222 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int n=sc.nextInt();
if (n%2==0) System.out.println(n/2*(n+1));
else System.out.println((n+1)/2*n);
}
}
}
4 、代码解析
方法
中,由于可能爆
int
,我们可以把n
转换成long
来使用,这样使用等差数列的过程中就不怕了,long
的取值范围足够我们使用。再考虑方法2,在我们等差数列的求和公式
中,有一个除
2
的步骤,如果我们能先执行该步骤,就能将或者
其中的一个值降下来,就不会超出
int
取值范围。所以我们应该对此进行分类,当
n
为奇数时:- 当
n
为偶数时: 因为
n
和n+1
的奇偶性不同,相乘一定为偶数。当如果需要先进行除以2
的操作,必须得使用偶数去除。当n
为偶数则使用n
,当n
为奇数说明n+1
是偶数则使用n+1
。
long
类型是Java
的一个基本数据类型,比int
的储存范围要大一个量级。达到了