本文已收录于专栏
🌸《Java入门一百例》🌸
序、专栏前言
?? 本专栏开启,目的在于帮助大家更好的掌握学习Java ,特别是一些Java学习者 难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。 ?? 但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。 ?? 算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。 ??学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
序、本章前言
?? 无论是任何语言,都一定是需要有循环 功能的,它的使用是大量复杂算法的基础。使用它可以帮助我们使用短短几行代码让计算机完成大量的计算。可以说掌握不好循环,就像没穿鞋的攀登者,简直是寸步难行。
一、for循环
??for 循环是所有循环使用最广泛的循环,它的大致主体为以下形式:
for (表达式1;表达式2:表达式3) {
}
-
(
1
)
(1)
(1)表达式1一般用于定义循环中所需要使用到的变量,也可以定义多个变量,表达式1只会在循环开始时调用1次
-
(
2
)
(2)
(2)表达式2是一个
布尔表达式 ,用于判断循环是否进行进行 -
(
3
)
(3)
(3)表达式3一般是一个循环变量控制语句,一般对表达式1中定义的变量进行自增
(
+
+
)
(++)
(++)或者自减(- -)。
-
(
3
)
(3)
(3)三个表达式都是可以省略不写的,但是一般只会遇见省略第一个表达式的情况,所以为了防止被他人暴打,还是不要干这种事情💢
-
(
3
)
(3)
(3)表达式之间必须用
; 隔开,注意不是逗号
?? 通过流程图来了解for 循环执行过程:
二、while循环
??while 循环同样是非常常用的循环,它的组成与for 循环相比更加简单,在上一章我们也粗略介绍过它。
while(布尔表达式){
}
-
(
1
)
(1)
(1)
while 循环只需要一个布尔表达式来控制循环,为true 则继续循环,为flase 则结束循环 ?? 从流程图就能看出while 循环的简易:
三、dowhile循环
??dowhile 循环是三个循环中最冷门的循环,它只是在while 的基础上做了一点变形。能遇见的场景屈指可数,使用的场景更是少之又少,不过还是必须掌握的基础内容。
do{
}while (布尔表达式);
-
(
1
)
(1)
(1)
dowhile 循环相当于先执行代码体,再进行布尔判断。while 循环则是先进行布尔表达式判断再执行代码体。 -
(
2
)
(2)
(2)
dowhile 相比while 的区别就是dowhile 一定会执行1 次代码体,而while 循环可能一次循环都不会进行。具体从循环流程图对比即可知道。 ??小结:三种循环各有特点,但其实所有功能使用三种循环都是可以实现的,只不过每个循环在某些特定的情况下,使用起来会更加方便和简单,可读性更强。
四、循环关键字
??continue 和break 是Java 中循环体内使用的关键字。
1、continue
??continue 的作用是终止当前循环,直接跳到下一次循环。具体作用见例题二。
2、break
??break 的作用是立刻结束循环,跳出循环。具体作用见例题三。
五、【例题1】
1、题目描述
??给定一个整数
N
(
1
≤
N
≤
1000
)
N(1\leq N\leq1000)
N(1≤N≤1000),请在控制台打印出
[
1
,
N
]
[1,N]
[1,N],并在输出[1,N]的和。
2、解题思路
?? 题目难度:??
??由于需要使用变量表示,而且变量的值需要改变,这里我们使用for 循环完成更佳,同时用一个int 类型变量res来累加和。
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++) {
System.out.println(i);
res=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();
for (int i = 1; i <=n; i++) {
System.out.println(i);
}
System.out.println(n*(n+1)/2);
}
}
4、代码解析
-
(
1
)
(1)
(1)题目要求需要用到自增与变量,所以使用
for 循环更佳 -
(
2
)
(2)
(2)循环内需要进行的操作每次输出
i 的值,res 累加上i 的值 -
(
3
)
(3)
(3)考虑到
[
1
,
N
]
[1,N]
[1,N]是等差数列,统计和的情况我们可以直接使用等差数列的公式:
S
n
=
n
?
(
n
+
1
)
/
2
S_n=n*(n+1)/2
Sn?=n?(n+1)/2
六、【例题2】
1、题目描述
??给定一个整数
N
(
1
≤
N
≤
1000
)
N(1\leq N\leq1000)
N(1≤N≤1000),请在控制台打印出
[
1
,
N
]
[1,N]
[1,N]中所有的奇数。
2、解题思路
?? 题目难度:??
??做法非常多,我们考虑使用continue 关键字,我们只需要奇数,所以如果我们判断到是偶数则可以使用continue 跳过,直接进入下一次循环。
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();
for (int i = 1; i <=n; i++) {
if (i%2==0) continue;
System.out.println(i);
}
}
}
2、解法2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for (int i = 1; i <=n; i+=2) {
System.out.println(i);
}
}
}
4、代码解析
-
(
1
)
(1)
(1)解法1中每次判断到
i 为偶数时,不会执行下面的输出语句直接进入下一个循环,奇数可以完成打印操作。 -
(
2
)
(2)
(2)解法2中考虑到奇数之间差值均为2,且
1 为奇数,所以在表达式3的位置每次让i+=2 ,这样每次i 的值都会是奇数,直接打印即可。
七、【例题3】
1、题目描述
??给定一个整数
N
(
1
≤
N
≤
1000
)
N(1\leq N\leq1000)
N(1≤N≤1000),接下来给定
N
N
N个整数,请输出第
1
1
1个既是既是
2
2
2的倍数又是
7
7
7的倍数的数,如果不存在则输出
?
1
-1
?1。
2、解题思路
??题目难度:??
??由于需要接收
N
N
N个数,所以我们需要使用数组先接收所有的数,然后通过for 循环来遍历数组。因为是找第1 个满足要求的数,所以找到以后后面的数就不需要再考虑了,可以直接break 跳出循环了。
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[] a=new int[n];
for (int i = 0; i <n; i++) {
a[i]=sc.nextInt();
}
int res=-1;
for (int i = 1; i <=n; i+=2) {
if (a[i]%2==0&&a[i]%7==0){
res=a[i];
break;
}
}
System.out.println(res);
}
}
4、代码解析
-
(
1
)
(1)
(1)首先要清楚,数组的下标从
0 开始,我们需要先使用数组通过for 循环接收所有的值。 -
(
2
)
(2)
(2)由于如果没找到符合要求的数输出
?
1
-1
?1,我们可以先设一个
int 类型的变量res为-1 ,这样如果在循环内未找到符合的数字时,它最后的值也会是-1 。 -
(
3
)
(3)
(3)当我们在循环内遍历到符合要求的数字时,我们将
res 的值更改,由于不需要再考虑后面的结果,我们使用break 关键字直接退出循环。
八、课后习题
👇 学习有疑问?👇
|