Ⅰ、一维数组
①变量概念:一种存储空间的表示
②数组概念:一组类型相同的连续的存储空间的表示
A. 优点
//1、类型相同:不用考虑类型
//2、连续:遍历
B.缺点
//1、类型相同:无法解决不同类型多个值的存储
//2、连续:插入,移除
C.使用数组四步骤
//1、声明 xxx[] arry;
//2、★分配空间 arry = new xxx[int LENGTH];
//3、赋值 arry[int INDEX] = VALUE;
//4、使用 System.out.println(arrty[int INDEX]);
D.数组的特征
//1、不可变
//2、长度固定:int len = arry.length;
//3、下标(索引):0~arry.length-1 :如果超出范围会报★异常
E.特殊语法
// 1+2+3 : xxx[] arry = {VALUE1,VALUE2,…};
int[] arr = {};
int[] arr2 = {5,7,9};
int[] arr3 = new int []{5,7,9};
Ⅱ、变量的作用域(生命周期)
A.{}
B.最小作用域原则
数组的基本概念
//声明
int[] arr;
//分配空间
arr = new int[5];
//赋值
arr[0]=5;
arr[1]=15;
arr[2]=8;
arr[3]=11;
arr[4]=7;
//使用
System.out.println(arr[4]);
System.out.println(arr[3]);
System.out.println(arr[2]);
System.out.println(arr[1]);
System.out.println(arr[0]);
创建长度为10,取值范围1~100的随机数
随机生成一个1~100之间的数值
检索该值是否存在于随机数组中
Random rand = new Random();
int[] arr = new int[10];
for(int i = 0;i<arr.length;i++){
arr[i] =rand.nextInt(100)+1;
}
int num =rand.nextInt(100)+1;
boolean has = false;
for (int i = 0; i < arr.length; i++) {
if(num ==arr[i]){
has = true;
break;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
System.out.println();
System.out.println(num);
System.out.println(has);
指定位置插入
利用下标与长度之间的关系
for (int i = arr.length-1; i>pos ; i--) {
arr[i] = arr[i - 1];
完整代码如下:
char[] arr ={'f','e','a','g','k','m','x',(char)0};
for (char c:arr){
System.out.print(c+"\t");
};
char t = 'y';
int pos = input.nextInt();
//挪
for (int i = arr.length-1; i>pos ; i--) {
arr[i] = arr[i - 1];
}
//插
arr[pos]=t;
System.out.println("-----------");
for(char c :arr){
System.out.print(c+"\t");
}
顺序插入
跟上一题不一样的点在于,多了输入值与数组内每一位数比大小。在for循环里利用下标的每次递减使数组的每位数都能与输入值进行比较。i从length-2开始,知道遇到第一个比它小的数结束。
char[] arr2 = {'b','d','f','i','k','m','x',(char)0};
for (char c : arr2) {
System.out.print(c + "\t");
}
char t2 = input.next().charAt(0);
//找位置,挪
int i = arr2.length - 2;
for (; i >= 0; i--) {
if (t2 >= arr2[i]) {
break;
}
arr2[i + 1] = arr2[i];
}
arr2[i + 1] = t2;
for (char c : arr2) {
System.out.print(c + "\t");
}
斐波那契数列的for循环结构
方法一:简单for循环
斐波那契数列前20(0, 1, 1, 2, 3, 5, 8, 13)
int x=0, y=1,t;
System.out.print(x+"\t"+y+"\t");
for(int i =1; i<=18;i++){
t =x+y;
System.out.print(t+"\t");
x=y;
y=t;
}
方法二:数组+for循环
用一维数组完成斐波那契数列前10项
int[] num = new int[10];
num[0] =0 ;
num[1] =1;
System.out.print(num[0]+ "\t"+num[1]+ "\t");
for (int i = 2; i < 10; i++) {
num[i]=num[i-1]+num[i-2];
System.out.print(num[i]+"\t");
}
随机生成30个1~1000的随机数,求最大值,最小值,平均值
int max,min,avg,total=0;
Random rand = new Random();
int[] arr = new int[30];
for(int i = 0;i<arr.length;i++){
arr[i] =rand.nextInt(1000)+1;
}
for (int i : arr) {
System.out.print(i + "\t");
}
max=arr[0];min=arr[0];
for(int j = 0;j<arr.length;j++){
total +=arr[j];
if(arr[j]>=max){
max=arr[j];
}
if(arr[j]<=min){
min=arr[j];
}
}
avg=total/arr.length;
System.out.println(MessageFormat.format("\n"+"最大值{0},最小值{1},平均数{2}",max,min,avg));
假设数组中的第一个数为中位数,找到其下标
int[] arr = {8,9,6,12,14,5,2};
for(int c:arr){
System.out.print(c+"\t");
}
System.out.println();
int begin=0,end=arr.length-1,mid=arr[0],t;
while(begin<end){
if(arr[end]>=mid) end--;
else {
if(arr[begin]<=mid) begin++;
else {
t = arr[begin];
arr[begin] = arr[end];
arr[end]=t;
}
}
}
if(begin!=0){
arr[0]=arr[begin];
arr[begin]=mid;
}
for (int c:arr){
System.out.print(c+"\t");
};
System.out.println();
System.out.println("中位数为"+mid+"它的下标为"+begin);
这道题的难点在于:要理解并掌握挪换的方法
挪换方法为:
①设定第一个数为中位数mid;
②先把mid与最后一个数进行比较。比较原则:如果end>mid,就往前挪移一个数,再比较
③再把mid与第二个数进行比较。比较原则:如果begin<mid,就往后挪移一个数,再比较
④如果 end<=mid && begin>=mid 则:两者对调。