目录
一.复习题
二.数组
三.一维数组
四.数组排序
五.数组的插入和删除
1.插入元素
插入元素案例
2.删除元素
删除元素案例
六.顺序查找
顺序查找案例
七.二分查找
二分查找案例
八.冒泡排序
笔记
一.复习题
- (一)求S=1!+2!+3!+·····+n!的阶乘和。
import java.util.Scanner;public class lian {public static void main(String[] args) {Scanner input = new Scanner(System.in);int num = input.nextInt();int sum = 0;for (int i = 1;i <= num;i++){int temp = 1;for (int j = 1;j <= i;j++){temp *= j;}sum += temp;}System.out.println(sum);}
}
-
(二)给定一个十进制正整数n(1<=n<=10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。(ag:当n=12时,写下1~12,这样就出现了5个“1”)。
import java.util.Scanner;public class lian {public static void main(String[] args) {Scanner input = new Scanner(System.in);int num = input.nextInt();int total = 0;//1的总数变量for (int i = 1;i <= num;i++){//i:当前数字//内层进行分离数位,对比统计1出现的个数//找替身变量int temp = i;while(temp !=0){//分离数位int n = temp%10;if (n == 1){total++;}temp /= 10;}}System.out.println(total);}
}
ps:在特殊情况在一定要学会找替身变量。
- (三)输入一个正整数n,求第n小的质数。
import java.util.Scanner;public class lian {public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();//输入的第几个质数int i = 0;//用i保存质数的总个数int num = 2;while (true) {//判断num是不是质数boolean flag = true;//假设输入的num是质数for (int j = 2; j < num; j++) {if (num % j == 0) {flag = false;//不是质数break;}}if (flag == true) {i++;//是质数if (i == n) {System.out.println(num);break;}}num++;}}}
二.数组
- 定义
数组就是一组相同类型的变量,它们往往都是为了表示同一批对象的统一属性。(ag:班级里所有同学的身高)
- 与变量的区别
三.一维数组
- 语法
数据类型[] 数组名 = new 数据类型 [大小];(ag: int[] a = new int[10];定义一个a数组,其中包含a[0]到a[9])
- 数组赋值方式
-
通过下标赋值。(ag:a[0] = 1;a[1] = 2;a[2] = 3;······)ps:复杂,基本不用
-
边声明边赋值。(ag:int[] score = {70,80,90};int[] score = new int[]{70,80,90};)
-
动态赋值。(ag:如下代码,从键盘输入值)ps:常用
import java.util.Scanner;public class lian {public static void main(String[] args) {int[] a =new int[10];Scanner input = new Scanner(System.in);//完成对数组元素的赋值操作for (int i = 0;i <a.length; i++){a[i] = input.nextInt();}//输出值for(int i = 0;i < a.length;i++){System.out.println(a[i]);}}
}
- 注意事项
-
数组名的命名规则和变量名相同,遵循标识符命名规则。(ps:变量命名规则在初识Java(二)中有详细笔记)
-
在数组定义时用方括号括起来的常量表达式的值表示元素的个数,即数组的长度。
-
下标从0开始。(ag:上述a数组的10个元素中最后一个元素为a[9])
-
在数组元素访问时,用方括号括起来的表达式表示元素的下标。
-
数组往往与循环语句结合使用。
-
数组中的元素可以相同。
-
如果直接打印数组名称,其实输出的是数组在内存中的地址。要想打印输出数组中的每一个元素,那么要使用循环,依次遍历打印数组中的每一项。
练习题
- (一)输入某次期中考试5位学员的成绩,求出其中的最高分
import java.util.Scanner;public class lian {public static void main(String[] args) {int[] scores =new int[5];Scanner input = new Scanner(System.in);for (int i = 0;i < scores.length; i++){scores[i] = input.nextInt();}//已经将分数放到了数组中//默认最大值int max = scores[0];for (int i =1;i < scores.length;i++){if (scores[i] > max){max = scores[i];}}//输出最大值System.out.println(max);}}
- (二)输入5个数,求其中的最小值
import java.util.Scanner;public class lian {public static void main(String[] args) {int[] scores =new int[5];Scanner input = new Scanner(System.in);for (int i = 0;i < scores.length; i++){scores[i] = input.nextInt();}//已经将数放到了数组中//默认最小值int min = scores[0];for (int i =1;i < scores.length;i++){if (min > scores[i]){min = scores[i];}}//输出最小值System.out.println(min);}}
四.数组排序
- 使用java.util.Arrays类,Arrays.sort()方法:对数组进行升序排序 Arrays.sort(数组名);
import java.util.Arrays;public class lian {public static void main(String[] args) {int[] nums ={8,1,3,4,2};Arrays.sort(nums);for (int i = 0;i < nums.length;i++){System.out.println(nums[i]);}}}
案例
-
院子里有颗苹果树,每到秋天,树上就会结出10个苹果。苹果成熟的时候,小明就会去摘苹果。小明有一张30厘米的板凳,当他不能直接用手摘到苹果时,就会使用板凳再试试。
-
现在已知10个苹果距离地面的高度,以及小明把手升直的时候能够达到的最大高度,请班小明算一下他能摘到的苹果数量。假设他碰到苹果,苹果就会掉下来。
import java.util.Scanner;public class lian {public static void main(String[] args) {//定义一个长度为11的数组,保存每个苹果离地面的高度int[] a = new int[11];Scanner input = new Scanner(System.in);for (int i = 1;i < a.length;i++) {a[i] = input.nextInt();}int height = input.nextInt();//小明伸手的最大高度//对比,统计int num = 0;for (int i = 1;i < a.length;i++){if (height + 30 >= a[i]){//板凳30的高度,最终小明能碰到的最大高度num++;}}System.out.println(num);}}
五.数组的插入和删除
- 定义
元素在实际应用中,经常需要在一个数组中插入一个元素,或者删除数组中的某一个元素,称为数组的“插入”操作或者“删除”操作。
1.插入元素
-
插入一个元素,需要先找到插入的位置(假设下标为index),将这个元素及其之后的所有元素依次往后移一位(注意要从后往前进行操作),再将给定的元素插入(覆盖)到位置index。
插入元素案例
-
有一个升序排序的成绩数组,其中成绩有78,87,95,98,100.增加一个学生的成绩,插入数组中后保证数组元素依然升序排列。
import java.util.Scanner;public class lian {public static void main(String[] args) {int[] nums = new int[6];Scanner input = new Scanner(System.in);nums[0]=78;nums[1]=87;nums[2]=95;nums[3]=98;nums[4]=100;//定义一个变量来保存新插入的分数int score = input.nextInt();//插入元素,分三步int index = nums.length - 1;for (int i = 0;i < nums.length;i++){if (score < nums[i]){index = i;break;}}//第二步:元素后移,倒着移动for (int j = nums.length - 1;j > index;j--){nums[j] =nums[j - 1];}//第三步:重新赋值nums[index] = score;//打印新的数组结果for (int i = 0;i < nums.length;i++){System.out.print(nums[i] + " ");}}}
ps:插入元素分三步
- 找位置,循环找位置。
- 元素后移,倒着移动。
- 重新赋值。
2.删除元素
-
删除某一个元素,也需要先找到删除的位置(假设下标为index),将下标为index+1及其之后的所有元素依次向前移一位,覆盖原来位置上的元素。
删除元素案例
-
有n位同学(每位同学都有个唯一的学号,用1~n之间的整数表示)在老师面前排队背书,现在第x位同学觉得自己忘了,便离开了队伍,求第x位同学离开队伍后的排队情况。
import java.util.Scanner;public class lian {public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();//总人数int[] a = new int[20];//最多20人排队for (int i = 1;i <= n;i++){a[i] = input.nextInt();}int num = input.nextInt();//删除元素for (int i = num;i <= n;i++){a[i] = a[i + 1];}n--;for (int i = 1;i <=n;i++){System.out.println(a[i] + "\t");}}}
ps:删除元素分两步
- 找位置。
- 元素前移,正向移动。
六.顺序查找
- 定义
顺序查找就是按照从前往后(或从后往前)的顺序,将数组中的元素依次与要查找的数num进行比较。
顺序查找案例
- 输入一个数字sum,表示学生的总人数,再输入num个数字表示学生的成绩,统计成绩为90分的有多少人?
import java.util.Scanner;public class lian {public static void main(String[] args) {Scanner input = new Scanner(System.in);int num = input.nextInt();int[] scores = new int[100];for (int i = 1;i <= num;i++){scores[i] = input.nextInt();}//只能一个个的对比进行查找int count = 0;for (int i = 1;i <= num;i++){if (scores[i] == 90){count++;}}System.out.println(count);}}
ps:顺序查找较慢。
七.二分查找
-
定义
二分查找又称“折半”查找,其优点是比较次数少、查找速度快。但是要求数据是递增或递减排序的。
二分查找案例
- 小明和小红玩游戏,小明心里想一个数字,小红来猜,小明根据小红猜测的数字提示“猜大了”、“猜小了”、“猜对了”。使用二分法模拟游戏的全过程。
import java.util.Scanner;public class lian {public static void main(String[] args) {System.out.println("请输入一个数字,范围是:(1~100之间,包含1和100)");Scanner input = new Scanner(System.in);int num = input.nextInt();int left = 1,right = 100;while (left <= right){//证明还可以继续查找int mid = (left + right) / 2;if (mid == num) {System.out.println(mid + "猜对了");break;}//猜大了if (mid > num){//进行调整,调整右边界right = mid - 1;System.out.println(mid + "猜大了");}//猜小了if (mid < num){//调整左边界}left = mid - 1;System.out.println(mid + "猜小了");}}
}
ps:二分查找的注意事项
- 关注左右边界。
- 循环条件,left <= right。
- 计算中间位置(left + right) / 2。
- 动态调整左右边界。
- 100个数字最多查找7次,原因是2的几次方>100。结果就应该是几。
- 大的前提是,数组元素必须是有序的。1~100数字本身就是有序的。
八.冒泡排序
- 底层本质就是一个二重循环。
- 外层循环控制比较的趟数。N-1
- 内层循环控制的是每一趟比较的次数。N-1-i(下标从0开始)N-i(下标从1开始)
案例
- 将数组元素 126 80 98 158 204,降序排序。
public class lian {public static void main(String[] args) {//冒泡排序底层的本质是一个二重循环//外层控制比较的趟数int[] nums ={126,80,98,158,204};for (int i = 1;i <= 4;i++){for (int j = 0;j <= 5 -1-i;j++){if (nums[j] < nums[j + 1]){int temp = nums[j];nums[j] = nums[j+1];nums[j+1]=temp;}}}for (int i = 0;i<nums.length;i++){System.out.println(nums[i]+"\t");}}
}
笔记
- 数组.length : 获取数组长度。