初识Java(六)(一维数组)(自己学习整理的资料)

目录

一.复习题

二.数组

 三.一维数组

 四.数组排序

五.数组的插入和删除 

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])   

  • 数组赋值方式
  1. 通过下标赋值。(ag:a[0] = 1;a[1] = 2;a[2] = 3;······)ps:复杂,基本不用

  2. 边声明边赋值。(ag:int[] score = {70,80,90};int[] score = new int[]{70,80,90};)

  3. 动态赋值。(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]);
        }
    }
}
  • 注意事项
  1. 数组名的命名规则和变量名相同,遵循标识符命名规则。(ps:变量命名规则在初识Java(二)中有详细笔记)

  2. 在数组定义时用方括号括起来的常量表达式的值表示元素的个数,即数组的长度。

  3. 下标从0开始。(ag:上述a数组的10个元素中最后一个元素为a[9])

  4. 在数组元素访问时,用方括号括起来的表达式表示元素的下标。

  5. 数组往往与循环语句结合使用。

  6. 数组中的元素可以相同。

  7. 如果直接打印数组名称,其实输出的是数组在内存中的地址。要想打印输出数组中的每一个元素,那么要使用循环,依次遍历打印数组中的每一项。

练习题

  • (一)输入某次期中考试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:插入元素分三步

  1. 找位置,循环找位置。
  2. 元素后移,倒着移动。
  3.  重新赋值。
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:删除元素分两步 

  1. 找位置。
  2. 元素前移,正向移动。

六.顺序查找

  • 定义

顺序查找就是按照从前往后(或从后往前)的顺序,将数组中的元素依次与要查找的数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:二分查找的注意事项

  1. 关注左右边界。
  2. 循环条件,left <= right。
  3. 计算中间位置(left + right) / 2。
  4. 动态调整左右边界。
  5. 100个数字最多查找7次,原因是2的几次方>100。结果就应该是几。
  6. 大的前提是,数组元素必须是有序的。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 : 获取数组长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值