Java学习记录
日期:10.8~9
📖今日知识点 ——什么是数组?
数组:是一种容器,可以用来存储同种数据类型的多个值
(变量能干的,数组能干;变量不能干的,数组能干;存储多个,行业特许,这就是数组!)
重新认识数组(内存)
💻练习代码
📖今日知识点 ——数组的静态初始化:定义数组、存储数据
初始化:是指在定义变量、数组、对象的时候进行赋值(定义+赋值 同时执行)
//初始化变量numintnum=10;静态初始化:创建数组的时候,直接给数组赋值
完整格式:数据类型 数组名[] = new 数据类型[]{数据值,数据值…};
int arr[] = new int []{1,2,3};[]是数组的标记,千万不能省略
简写格式:数据类型 数组名[] ={数据值,数据值…};
int arr[] = {1,2,3};数组特点1:连续的空间
数组特点2:一旦定义,长度不可变
💻练习代码
packageArrayDemo;publicclassArrayDemo1{publicstaticvoidmain(String[]args){/* 数组的静态初始化: 1、定义数组存储3位同学的年龄 2、定义数组存储5位同学的身高 3、定义数组存储3位同学的姓名 完整格式:数据类型 数组名[] = new 数据类型[]{数据值,数据值...}; int arr[] = new int []{1,2,3}; 简写格式:数据类型 数组名[] ={数据值,数据值...}; int arr[] = {1,2,3}; */intageArr1[]={18,19,20};doubleheightArr2[]={178.0,179.0,179.8};StringnameArr3[]={"张三","叶汶","王五"};}}📖今日知识点 ——数组的元素访问:获取、修改数组里面的数据
索引:索引是数组的一个编号,也叫做:角标、下标、编号
索引特点:从0开始的,连续+1,不间断
获取数组元素:变量 = 数组名[索引]; int num = arr[5];
修改数组元素:数组名[索引] = 数据值; arr[5] = 10;
💻练习代码
packageArrayDemo;publicclassArrayDemo2{publicstaticvoidmain(String[]args){/* 数组中元素的访问: 1、获取数据 2、修改数据 *///1、静态初始化创建数组intarr[]={1,2,3,4,5};//0 1 2 3 4//2、获取数组中元素的值intnum=arr[0];System.out.println(num);//1System.out.println(arr[2]);//3//3、修改数组中元素的值//注意:一旦修改完毕,原来的数据就会被覆盖arr[1]=10;System.out.println(arr[1]);//10}}📖今日知识点 ——数组的遍历:获取数组里面的所有元素
💻练习代码
packageArrayDemo;publicclassArrayDemo3{publicstaticvoidmain(String[]args){/* 数组的遍历:定义一个整数数组,里面存储任意数据,并将数组遍历并打印 *///1、利用静态初始化创建数组/*int arr[] = {1,2,3,4,5}; //2、循环遍历数组 //arr.length:数组的长度,数组中最后一个元素的索引加1 //for(int i = 0; i < arr.length; i++) for(int i = 0; i <= arr.length - 1; i++) System.out.println(arr[i]); *///遍历数组的快速生成方式//数组名.fori然后回车intarr[]={1,2,3,4,5};for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}}}📖今日知识点 ——数组的动态初始化:创建数组的时候,先给一些默认值,等知道要存什么数据了,再修改。
动态:在定义变量、数组、对象的时候,数据是不确定的
初始化:创建数组的时候,直接给数组赋值(定义+赋值同时执行)
动态初始化:创建数组的时候指定长度,由系统为数组分配初始值
完整格式:数据类型 数组名[] = new 数据类型[长度];
int arr [] = new int [3];💻练习代码
packageArrayDemo;importjava.util.Scanner;publicclassArrayDemo4{publicstaticvoidmain(String[]args){/* 数组动态初始化: 需求: 键盘录入5个整数,存入数组当中,并进行遍历 动态初始化的格式:数据类型 数组名[] = new 数据类型[数组长度]; 先一个循环,一个判断,只做一件事 *///1、创建数组intarr[]=newint[5];//2、键盘录入数据Scannersc=newScanner(System.in);for(inti=0;i<arr.length;i++){System.out.println("请输入一个整数:");arr[i]=sc.nextInt();}//3、遍历数组for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}}}📖今日知识点 ——数组的常见问题、算法真题
最大的问题:数组的索引越界(0~arr.length-1)
💻练习代码
练习代码1:
packageArrayDemo;importjava.util.Scanner;publicclassTest1{publicstaticvoidmain(String[]args){/* 练习:查找数据 需求: 已知数组元素为 {33,5,22,44,55,33} 键盘录入任意一个数据,查找这个数据在数组中是否存在 如果数组中要查找的数据出现多次,只要显示第一次的索引即可 输出要求: 如果存在打印索引 如果不存在,提示:“该数据不存在” 细节一:什么情况下,我才能断定数据在数组中不存在? 只有当for循环执行完毕,还没有找到num,我才能断定数据在数组中不存在 细节二:两种写法flag(标记) count(次数) *///1、定义数组int[]arr={33,5,22,44,55,33};//2、键盘录入数据Scannersc=newScanner(System.in);System.out.println("请输入一个数据:");intnum=sc.nextInt();//作用:记录数组当中是否存在num//boolean flag = false;//作用:记录数组当中num出现的次数intcount=0;//3、拿着num跟数组的每一个元素挨个比较for(inti=0;i<arr.length;i++){//i是索引,arr[i]才是元素/数据if(num==arr[i]){//flag = true;count++;System.out.println(i);break;//一旦找到,就结束for循环}}//4、判断flag的值/*if(!flag){//if里为真时才会执行,即flag为false时执行 System.out.println("该数据不存在"); } */if(count==0){System.out.println("该数据不存在");}}}练习代码2:
packageArrayDemo;publicclassTest2{publicstaticvoidmain(String[]args){/* 求最大值:已知数组元素为 {33,5,22,44,55} 核心一:最初是第一个人先接受挑战 核心二:两两比较,大的晋级下一轮 细节一:循环的开始条件,如果为0,请问:对结果有什么影响?没有影响,就是循环多进行一次 细节二:max的初始化值,能不能赋值为0?不能,万一数组里的元素都是负数,那么0就是最大值了 max的初始值,不能赋为0;max记录的值,一定是数组里的元素 *///1、创建数组intarr[]={33,5,22,44,55};//2、定义一个变量(擂台),默认记录第一个值intmax=arr[0];//3、让后面的人依次跟擂台的人比较一下for(inti=1;i<arr.length;i++){//4、比较,如果后面的人比擂台的人大,就让后面的人上台if(arr[i]>max){max=arr[i];}}System.out.println("最大值是:"+max);}}练习代码3:
packageArrayDemo;publicclassTest4{publicstaticvoidmain(String[]args){/* 前置练习: 交换两个变量中的数据 */inta=10;intb=20;/*a = b;//a=20,b=20 b = a;//a=20,b=20 *///定义一个临时变量,用于记录a的值inttemp=a;//变量b中记录得知赋给变量aa=b;//变量a中记录得知赋给变量bb=temp;System.out.println(a);System.out.println(b);}}packageArrayDemo;importjava.util.Random;publicclassTest3{publicstaticvoidmain(String[]args){/* 需求:已知数组元素为{1,2,3,4,5,6,7,8,10} 要求:打乱数组中的元素 思路:第一步:0索引上的数据,跟随机位置上的数据进行交换 第二步:重复第一步 细节一:如何交换两个位置上的数据,假如交换a和b,利用第三变量temp存储a的值,然后b的值赋给变量a,a=b,最后temp的值(即a的值)赋给b 细节二:如何获取一个随机的索引 Random r = new Random();//这里括号不写东西,要是Scanner就要写System.in int randomIndex = r.nextInt(arr.length);//范围 *///1、定义数组intarr[]={1,2,3,4,5,6,7,8,9,10};Randomr=newRandom();//2、遍历数组for(inti=0;i<arr.length;i++){//i是索引,arr[i]是元素//第一次循环:i = 0;//获取一个随机的索引intrandomIndex=r.nextInt(arr.length);//0~9//拿着索引i上的元素,跟随机索引上的数据进行交换inttemp=arr[i];arr[i]=arr[randomIndex];arr[randomIndex]=temp;}//3、遍历数组,输出结果for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}}}练习代码4:
packageArrayDemo;importjava.util.Random;publicclassTest5{publicstaticvoidmain(String[]args){/* 需求:获取10个 1~100之间的随机数并存入到数组当中,要求保证数据是唯一的 核心思路:如果存在就不存,就继续生成下一个随机数; 如果不存在,就存入到数组当中 1、创建数组 2、生成随机数 3、判断数组中是否存在该随机数 4、如果存在,就继续生成下一个随机数 5、如果不存在,就存入到数组当中 问题1:为什么整个结果当中会有0?因为如果生成的随机数已经存在了,不存入数组但会默认为0. *///1、创建数组intarr[]=newint[10];//2、生成随机数Randomr=newRandom();//3、判断数组中是否存在该随机数//i作用是随机数应存入的位置for(inti=0;i<arr.length;i++){intnum=r.nextInt(1,101);//对num进行判断,不存在——存入;存在——不存intcount=0;//j是遍历数组的索引for(intj=0;j<arr.length;j++){if(num==arr[j]){//存在count++;//跳出循环break;}}//对count进行判断if(count==0){arr[i]=num;//只有生成一个满足的要求的随机数,索引才会自增i++;//***}}//遍历数组for(inti=0;i<arr.length;i++){System.out.println(arr[i]+" ");}System.out.println();}}练习代码5:
packageArrayDemo;importjava.util.Random;publicclassTest6{publicstaticvoidmain(String[]args){/* 需求:获取10个 0~100之间的随机数并存入到数组当中,要求保证数据是唯一的 核心思路:如果存在就不存,就继续生成下一个随机数; 如果不存在,就存入到数组当中 1、创建数组 2、生成随机数 3、判断数组中是否存在该随机数 4、如果存在,就继续生成下一个随机数 5、如果不存在,就存入到数组当中 问题1:为什么整个结果当中会有0?因为如果生成的随机数已经存在了,不存入数组但会默认为0. *///1、创建数组intarr[]=newint[10];// 此时 arr 的每个元素都是 0:// arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]// 2、生成随机数Randomr=newRandom();//size记录已存入的有效数据个数intsize=0;// 3、循环生成随机数,直到存满10个while(size<arr.length){intnum=r.nextInt(101);//0~100//4、判断已存入的数据中是否存在该随机数Booleanflag=false;for(intj=0;j<size;j++){if(num==arr[j]){flag=true;break;}}//5、不存在就存入if(!flag){arr[size]=num;size++;}// 存在的话什么都不做,继续循环重新生成随机数}//遍历数组for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}System.out.println();}}练习代码6:
packageArrayDemo;publicclassTest7{publicstaticvoidmain(String[]args){/* 练习:去除重复元素:给定义一个递增有序数组,去除重复元素 慢指针:存入的位置 快指针:找不重复的数据 相等:舍弃快指针的数据、快指针后移 不相等:快指针的数据存入慢指针的位置、慢指针后移、快指针后移 *///1、定义一个递增有序数组intarr[]={1,1,2,2,2,2,3,3,3,3};//2、定义两个指针intslow=0;intfast=1;//3、利用循环不断移动快慢指针,找不重复的元素while(fast<arr.length){//循环结束条件//4、判断快慢指针的元素是否相等/* if(arr[slow] == arr[fast]){ fast++;//相等:舍弃快指针的数据、快指针后移 }else{//不相等:快指针的数据存入慢指针的位置、慢指针后移、快指针后移 slow++;//慢指针要先后移才可以将快指针的数据赋值给慢指针 arr[slow] = arr[fast]; fast++; }*/if(arr[slow]!=arr[fast]){slow++;//慢指针要先后移才可以将快指针的数据赋值给慢指针arr[slow]=arr[fast];}fast++;}//5、输出结果for(inti=0;i<=slow;i++){System.out.print(arr[i]+" ");}System.out.println();}}练习代码7:
packageArrayDemo;publicclassTest8{publicstaticvoidmain(String[]args){/* 练习:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 要求1:只要求输出一个结果即可,不要求输出所有可能的结果。 要求2:要求输出所有可能的结果。 *///要求1:只要求输出一个结果即可,不要求输出所有可能的结果。intarr[]={2,7,11,18,6};inttarget=13;booleanflag=false;//标记是否找到for(inti=0;i<arr.length;i++){for(intj=i+1;j<arr.length;j++){if(arr[i]+arr[j]==target){System.out.println(i+" "+j);flag=true;break;//找到后就退出内循环}}if(flag){break;//找到后就退出外循环}}//如果找不到就输出没有找到if(!flag){System.out.println("没有找到");}}}练习代码8:
packageArrayDemo;publicclassTest9{publicstaticvoidmain(String[]args){/* 练习:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 要求1:只要求输出一个结果即可,不要求输出所有可能的结果。 要求2:要求输出所有可能的结果。 *///要求2:要求输出所有可能的结果。intarr[]={2,7,11,18,6};inttarget=13;booleanflag=false;//标记是否找到for(inti=0;i<arr.length;i++){for(intj=i+1;j<arr.length;j++){if(arr[i]+arr[j]==target){System.out.println(i+" "+j);flag=true;}}}//如果找不到就输出没有找到if(!flag){System.out.println("没有找到");}}}练习代码8:
packageArrayDemo;publicclassTest11{publicstaticvoidmain(String[]args){/* 作业3:查找元素(力扣算法) 题目描述: 给定一个递增的有序数组和一个目标值,在数组中找到目标值,打印其索引。 如果目标值不存在于数组中,打印应插入的位置。 举例1: 数据:nums = [1,3,5,6]; target = 5 输出:2 举例2: 数据:nums = [1,3,5,6], target = 2 输出:1 举例3: 数据:nums = [1,3,5,6], target = 7 输出:4 */intnums[]={1,3,5,6};// 有序数组inttarget=2;booleanflag=false;// 标志位,用于判断目标值是否存在于数组中for(inti=0;i<nums.length;i++){// 只要当前元素大于或等于目标值,插入位置就是当前索引 iif(nums[i]>=target){System.out.println(i);flag=true;break;// 找到目标值后退出循环}}// 如果循环结束都没有找到(说明数组里所有数都比 target 小)if(!flag){System.out.println(nums.length);//输出4}}}