数组定义
题目1:
public class Hw1{
public static void main(String[] args){
char[] c1 = new char[26];
c1[0] = 'A';
for (int i = 1; i <= 25; i++){
c1[i] = (char)(c1[0] + i);
}
System.out.println(c1);
//自己写的烂方法:
char[] c2 = new char[26];
for (int i = 0; i < c2.length; i++){
c2[i] = 'A' + i;
}
System.out.println(c2);
// 老师给的牛犇的方法
}
}
题目2:
public class Hw1{
public static void main(String[] args){
int[] a = {4, -1, 9, 10, 23};
int max = a[0];
int indx = 0;
for (int i = 0; i < a.length; i++){
if (max <= a[i]){
max = a[i];
indx = i;
}
}
System.out.println("最大值是"+max+" 下标是"+indx);
}
}
数组赋值
数组的拷贝
将int[] arr1 = {1, 2, 3} 拷贝到arr2数组,要求数据空间是独立的
创立新的数组,开辟新空间
遍历arr1,把每个元素拷贝到arr2的对应位置
数组翻转
思路1:注意吧len = arr.length
public class Hw1{
public static void main(String[] args){
int[] arr = {11, 22, 33, 44, 55, 66};
//把arr[1]和arr[5]交换,
// arr[2]和arr[4]交换...
int len = arr.length;
for(int i = 0; i < len / 2; i++){
int temp = arr[i];
arr[i] = arr[len - i - 1];
arr[len - i - 1] = temp;
}
for(int i = 0; i < len; i++){
System.out.println(arr[i]);
}
}
}
思路2:逆序赋值法
先开辟一个新的数组
逆序遍历arr1, 顺序遍历新数组,把arr1的那个数据反着传给新数组
记得要把arr2的地址给到arr1,不然arr1没改变,然后会被java垃圾回收机制收走
注意:主要是那个arr2的下标用j,仔细看一下
public class Hw1{
public static void main(String[] args){
int[] arr1 = {11, 22, 33, 44, 55, 66};
int[] arr2 = new int[arr1.length];
for(int i = arr1.length - 1, j = 0; i >= 0; i--, j++){
arr2[j] = arr1[i];
}
arr1 = arr2;
for (int i = 0; i < arr2.length; i++){
System.out.print(arr1[i]+"\t");
}
}
}
数组扩容
要求:给arr添加内容,先问用户要不要添加,y/n
思路:
开辟新数组,长度是原数组+1,把原数组依次赋值
在屁股上加一个
改指针
用do-while + break控制用户要不要添加
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int arr[] = {1, 2, 3};
do{
Scanner myScanner = new Scanner(System.in);
System.out.println("请问您是否要为数组添加一个数据?");
char key = myScanner.next().charAt(0);
if (key == 'n'){
break;
}
int[] arr2 = new int[arr.length + 1];
System.out.println("请输入您要添加的数据?");
int num = myScanner.nextInt();
for (int i = 0; i < arr.length; i++){
arr2[i] = arr[i];
}
arr2[arr2.length - 1] = num;
arr = arr2;
for (int i = 0; i < arr2.length; i++){
System.out.print(arr2[i] + "\t");
}
} while(true);
}
}
数组缩减
排序
冒泡排序:外层控制我们一共要比较多少轮,内层控制从第0个数开始,要比多少次
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int arr[] = {2, 10, 7, 5, 8, 6, 9};
for(int i = 0; i < arr.length - 1; i++){
for (int j = 0; j < arr.length - 1 - i; j++){
if (arr[j] >= arr[j+1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + "\t");
}
}
}
查找
注意:有个小技巧,初始化index=-1来表示没有找到匹配的
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
String[] names = {"hy", "lwj", "dxy", "tl", "zsq"};
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入您要查找的字符串:");
String name = myScanner.next();
//技巧:index = -1
int index = -1;
for (int i = 0; i < names.length; i++){
if(name.equals(names[i])){
index = i;
System.out.println(name + "是第" + i +"个字符串");
}
}
if(index == -1){
System.out.println("没找到" + name);
}
}
}
二维数组
定义:原来每个一维数组的每个元素是一维数组,就构成二维数组
第一个表示二维数组里面有几个一维数组,第二个表示每个一维数组里面有几个元素
二维数组在内存里面的存在形式:
ok,现在打印出图片中的数组:
public class Lianxi{
public static void main(String[] args){
int[][] arr = new int[3][];//新建一个二维数组,有三个一维数组构成,但是每个一维数组没有开空间,指向的地址都是null
for(int i = 0; i < arr.length; i++){
arr[i] = new int[i + 1];//给每个一维数组单独开辟空间
for(int j = 0; j < arr[i].length; j++){
arr[i][j] = i + 1;
System.out.print(arr[i][j] + " ");
}
System.out.println("");
}
}
}
静态初始化:
二维数组的应用
杨辉三角形
/*打印杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
*/
//主要是三个规律把握住:
/*(1) 第i+1行有i个元素
(2) 每行首末数字为1
(3) yanghui[i][j] = yanghui[i - 1][j] + yanghui[i - 1][j - 1];
*/
public class Lianxi{
public static void main(String[] args){
int[][] yanghui = new int[10][];
for(int i = 0; i < yanghui.length; i++){
yanghui[i] = new int[i + 1];
yanghui[i][0] = 1;
yanghui[i][yanghui[i].length - 1] = 1;
for(int j = 1; j < yanghui[i].length - 1; j++){
yanghui[i][j] = yanghui[i - 1][j] + yanghui[i - 1][j - 1];
}
}
for(int i = 0; i < yanghui.length; i++){
for(int j = 0; j < yanghui[i].length; j++){
System.out.print(yanghui[i][j]+" ");
}
System.out.println("");
}
}
}
本章练习题
1
我的思路:
先定位,再插入,
定位:采用index来定,这个和老师想得一样,但是遍历结束a, index=-1 之后,更为简洁的是,让index = a.length 表示插入的位置在最后一个。
插入:我的想法只用了一个下标,所以代码看着挺复杂的,没有老师的简洁。
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int[] a = {10, 12, 45, 99};
int[] b = new int[a.length + 1];
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入您要添加的数字");
int num = myScanner.nextInt();
int index = -1;
for(int i = 0; i < b.length; i++){
if(a[i] >= num){
index = i;
break;
}
}
for(int i = 0; i < b.length - 1; i++){
if (index == -1){
b[i] = a[i];
b[b.length - 1] = num;
}else if (i < index){
b[i] = a[i];
}else if(i == index){
b[i] = num;
b[i + 1] = a[i];
}else if( i > index){
b[i + 1] = a[i];
}
}
for(int i = 0; i < b.length; i++){
System.out.print(b[i] + " ");
}
}
}
下面附上老师的思路:
用i表示新数组下标,j表示原来的数组下标,赋值的时候跳过index这个地方
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int[] a = {10, 12, 45, 99};
int[] b = new int[a.length + 1];
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入您要添加的数字");
int num = myScanner.nextInt();
int index = -1;
for(int i = 0; i < b.length; i++){
if(a[i] >= num){
index = i;
break;
}
}
if (index == -1){
index = a.length;
}
for(int i = 0, j = 0; i < b.length; i++){
if(index != i){
b[i] = a[j];
j++;
}else{
b[i] = num;
}
}
for(int i = 0; i < b.length; i++){
System.out.print(b[i] + " ");
}
}
}
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int[] a = new int[10];
for (int i = 0; i < a.length; i++){
a[i] = (int)(Math.random()*100) + 1;
}
double sum = 0;
int max = a[0];
int maxIndex = -1;
for(int i = a.length - 1; i >= 0; i --){
System.out.print(a[i] + "\t");
sum += a[i];
if(max <= a[i]){
max = a[i];
maxIndex = i;
}
if(a[i] == 8){
System.out.println(a[i] + "= 8");
}
}
System.out.println("最大值为" + max + ",下标为" + maxIndex);
System.out.println("平均值为" + sum/a.length);
}
}
冒泡排序:
import java.util.Scanner;
public class Lianxi{
public static void main(String[] args){
int[] a ={3, 6, 1, 5, 2, 10, 9};
int temp = 0;
for (int i = 0; i < a.length - 1 ; i++){
for (int j = 0; j < a.length - i - 1; j++){
if(a[j] >= a[j + 1]){
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(int i = 0; i < a.length; i++){
System.out.print(a[i] + " ");
}
}
}