目录
一.复习题
- (一)求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 : 获取数组长度。