数组和算法
有一个需求,有一百个学生报名,我想记录一下这一百个学生的年龄和姓名,或者计算一下学生的平均年龄,难道我们要定义一百个变量吗?
int student1 = 12;
...
算了不写了。
合理的做法一定是,在内存里找一个片空间,按顺序存起来。其实这个道理很简单,一拿一个苹果用手拿就行,如果是10个你就要用篮子或袋子拿了,如果是一万个,你就要用卡车拉了。同理在计算机中,我们有这样一种数据结构能帮助我们把想同类型的数据统一聚拢放在一起,他就是【数组】。
一、数组的定义
1、基本概念与内存图
数组可以存放多个同一类型的数据。 数组也是一种数据类型, 是引用类型,他在内存里是这个样子的。
他是这样定义的。
定义:
int[] nums;
初始化:
nums = new int[3];
赋值:
nums[0] = 1;
nums[1] = 4;
nums[2] = 3;
// 直接定义初始化并赋值
int[] nums = {1,2,3};
// 这样写也行
int nums[] = new int[5];
int nums[] = new int[]{1,2,4,5};
// 数组有一个属性,可以获得数组的长度
nums.length
类型[] 名字 = new 类型[长度];
说说这三个步骤,如图:
2、数组的性质
数组的特性:
-
数组一旦建立,长度不能改变。
-
每个位置只能存一个值,多了会覆盖。
-
数组创建后会有默认值:int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000, boolean false, String null
-
编号从0开始,下标必须在指定范围内使用, 否则报: 下标越界异常。
-
他有个长度的属性,最后一个位置的编号是 长度-1。 0 - length -1
-
数组里边可以是基本类型,也可以是引用类型。
3、数据结构
数据结构与算法
数组是一种最基本的数据结构,是表的一种,是一种二维的线性表,我们以后还会接触链表,hash表等。
百度百科是这样解释线性表的:
- 线性表是最基本、最简单、也是最常用的一种数据结构。线性表*(linear list)*是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
- 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的)。
二、玩转数组
1、通循环遍历打印数组的每一个值
我们已经学习过了for循环,for循环正好能从0循环到某一个值,而这刚好可以对应我们数据的下标,写出一个优雅的循环。
我们要明确的是我的的范围是 0 ~ length -1
for (int i = 0; i < salary.length; i++) {
System.out.println(salary[i] + " ");
}
使用while循环实现
int aa = 0;
while(aa<d.length){
System.out.println(d[aa]);
aa++;
}
2、查找一个数组里存在的值
思路很简单,遍历每一个值,然后比较,知道遇到这个值为止。
int aa = 0;
int target = 2;
while(aa<d.length){
if(d[aa] == target){
System.out.println(d[aa]);
break;
}
aa++;
}
3、打擂台的形式找最大值
// 定义一个数组,存放各路英雄豪杰
int[] salary = {4,5,0,6,7,8};
// 搞一个擂台,让第0个人上来
int maxIndex = 0 ;
// 然后从第一个开始打
for (int i = 1; i < salary.length; i++) {
// 谁赢了,谁继续在台上站着
if(salary[i] > salary[maxIndex]){
maxIndex = i;
}
}
System.out.println(maxIndex+":"+salary[maxIndex])
4、元素的位移
一个新的需求:
我门计划将数组中的两个元素交换位置。
int[] salary = {4,5,0,6,7,8};
int temp = salary[0];
salary[0] = salary[1];
salary[1] = temp;
5、数组的反转
思路一:
创建一个等长的数组,反向放入,最后改变引用即可
int[] nums = new int[]{3,4,6};
int[] temp = new int[nums.length];
for (int i = nums.length - 1; i >= 0; i--) {
temp[i] = nums[nums.length - 1 - i];
}
nums = temp;
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
思路二
利用交换的方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30k3tcxn-1656599782326)(D:\下载\image-20210802164737918.07a64c42.png)]
// 定义原始数组
int[] nums = new int[]{3,4,6};
// 交换反转
for (int i = 0; i < nums.length/2; i++) {
int temp = nums[nums.length - 1 - i];//保存
nums[nums.length - 1 - i] = nums[i];
nums[i] = temp;
}
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}