0715(010天 数组基操下)

0715(010天 数组基操下)

每日一狗(一只明智的生活

在这里插入图片描述

主标题

1. 经典案例

1.1 数组的逆序

package com.ketang;

public class T01数组的逆序 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//		arr = niXu(arr);
		niXu(arr);
		for (int i : arr) {
			System.out.print(i + "\t"); // 	9	8	7	6	5	4	3	2	1
		}
	}

	public static int[] niXu(int[] arr) {
		int tmp;
		for (int i = 0; i < arr.length / 2; i++) {
			tmp = arr[i];
			arr[i] = arr[arr.length - i - 1];
			arr[arr.length - i - 1] = tmp;
		}

		return arr;
	}

}

1.2 数组的练习题

  1. 猜数游戏。5个数(1~0)猜中一个就是猜中了,没有提示
package com.ketang;

import java.util.Arrays;
import java.util.Scanner;

public class T03猜数游戏升级版 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = new int[5];
		int tmp;
		int i = 0;
		while (i < arr.length) {
			if (arr[arr.length - 1] > 0) {
				break;
			}
			tmp = (int) (Math.random() * 20 + 1);
			if (!exits(arr, tmp)) {
				arr[i++] = tmp;
			}
		}
		System.out.println(Arrays.toString(arr));

		Scanner sc = new Scanner(System.in);
		int target;
		while (true) {
			System.out.println("请输入一个1~20的整数");
			target = sc.nextInt();
			if (exits(arr, target)) {
				System.out.println("猜对了");
				break;
			} else {
				System.out.println("猜错了");
			}
		}
		sc.close();
	}

	public static boolean exits(int[] arr, int target) {
		for (int i : arr) {
			if (target == i) {
				return true;
			}
		}
		return false;
	}

}

  1. 数组的逆序
package com.ketang;

public class T01数组的逆序 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//		arr = niXu(arr);
		niXu(arr);
		for (int i : arr) {
			System.out.print(i + "\t"); // 9 8 7 6 5 4 3 2 1
		}
	}

	public static int[] niXu(int[] arr) {
		int tmp;
		for (int i = 0; i < arr.length / 2; i++) {
			tmp = arr[i];
			arr[i] = arr[arr.length - i - 1];
			arr[arr.length - i - 1] = tmp;
		}

		return arr;
	}

}

  1. 编写一个程序,提示用户输入学生数量后,再依次输入姓名和成绩,按照成绩的降序来打印学生的姓名
package com.ketang;

import java.util.Scanner;

public class T04学生排序 {
	static Scanner sc = new Scanner(System.in);
// test
// 请输入要录入的学生数量
// 3
// 姓名:zhangsan
// 成绩:50
// 姓名:wangwu
// 成绩:90
// 姓名:lishishi
// 成绩:999
// 输入数据不合法请重新输入
// 成绩:80
// 第1名学生 姓名:wangwu,成绩:90
// 第2名学生 姓名:lishishi,成绩:80
// 第3名学生 姓名:zhangsan,成绩:50

	public static void main(String[] args) {
		// 编写一个程序,提示用户输入学生数量后,再依次输入姓名和成绩,按照成绩的降序来打印学生的姓名

		System.out.println("请输入要录入的学生数量");
		int len = sc.nextInt();
		String[] names = new String[len];
		int[] scores = new int[len];
		input(names, scores);
		sort(names, scores);
		for (int i = 0; i < names.length; i++) {
			System.out.println("第" + (i + 1) + "名学生 姓名:" + names[i] + ",成绩:" + scores[i]);
		}

	}

	public static String inputName() {
		String name = "";

		while (true) {
			System.out.print("姓名:");
			name = sc.next();
			if (name.length() < 6 || name.length() > 20) {
				System.out.println("输入数据不合法请重新输入");
			} else {
				break;
			}
		}
		return name;
	}

	public static int inputScore() {
		int score;
		while (true) {
			System.out.print("成绩:");
			score = sc.nextInt();
			if (score < 0 || score > 100) {
				System.out.println("输入数据不合法请重新输入");
			} else {
				break;
			}
		}
		return score;
	}

	public static void input(String[] names, int[] scores) {

		for (int i = 0; i < names.length; i++) {
			names[i] = inputName();
			scores[i] = inputScore();
		}
	}

	public static void sort(String[] names, int[] scores) {
		for (int i = 1; i < names.length; i++) {
			String name;
			int score;
			for (int j = 0; j < names.length - i; j++) {
				if (scores[j] < scores[j + 1]) {
					name = names[j + 1];
					names[j + 1] = names[j];
					names[j] = name;

					score = scores[j + 1];
					scores[j + 1] = scores[j];
					scores[j] = score;
				}
			}
		}
	}

}

  1. 编写一个程序,能够读入10个整数,并且存储其中互不相同的数,最后将这10个数输出
package com.ketang;

import java.util.Scanner;

public class T05录入去重又不去重 {
//test
//12 15 16 15 2 3 1 5 6 4 5 6
//12	15	16	3	1	4	
//12	15	16	15	2	3	1	5	6	4	

	public static void main(String[] args) {
		// 编写一个程序,能够读入10个整数,并且存储其中互不相同的数,最后将这10个数输出
		// read num
		String nums = "";
		String num = "";
		Scanner sc = new Scanner(System.in);
		String tmpString;
		for (int i = 0; i < 10; i++) {
			tmpString = sc.next() + "\t";
			nums += tmpString;
			if (num.indexOf(tmpString) < 0) {
				num += tmpString;
			}
		}
		sc.close();
		System.out.println(num);
		System.out.println(nums);
	}

}

  1. 数组{1,3,9,5,6,7,1,5,4,8}使用二分法查找元素8的位置
package com.ketang;

import java.util.Arrays;

public class T06二分 {

	public static void main(String[] args) {
		// {1,3,9,5,6,7,1,5,4,8} 找 8在哪里
		int[] arr = { 1, 3, 9, 5, 6, 7, 1, 5, 4, 8 };
		System.out.println(Arrays.toString(arr));
		int tmp;
		for (int i = 1; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i; j++) {
				if (arr[j] > arr[j + 1]) {
					tmp = arr[j + 1];
					arr[j + 1] = arr[j];
					arr[j] = tmp;
				}
			}
		}
		// 二分法
		System.out.println(Arrays.toString(arr));
		int start = 0;
		int end = arr.length - 1;
		int target = 4;
		int mean;
		int posIndex = -1;
		while (start <= end) {
			mean = (start + end) / 2;
			if (arr[mean] > target) {
				end = mean - 1;
			} else if (arr[mean] < target) {
				start = mean + 1;
			} else {
				posIndex = mean;
				break;
			}
		}
		System.out.println(target + ":" + posIndex);
	}

}

1.3 数组的部分方法

  • 打印输出一个数组
int[] arr = { 1, 2, 3 };
String x = Arrays.toString(arr); // 返回字符串
System.out.println(x); // [1, 2, 3]

1.4 多维数组

多维数组在声明的时候可以只指定最高维度的数组;

// TODO Auto-generated method stub
int[][] arr1 = new int[3][3]; // 数组大小定死了

int num = 1;
for (int i = 0; i < arr1.length; i++) {
    for (int j = 0; j < arr1[i].length; j++) {
        arr1[i][j] = num++;
    }
}
for (int i = 0; i < arr1.length; i++) {
    for (int j = 0; j < arr1[i].length; j++) {
        System.out.print(arr1[i][j] + "\t");
    }
    System.out.println();
}
//	1	2	3	
//	4	5	6	
//	7	8	9	
int[][] arr2 = new int[3][]; // 低纬度范围不定值
arr2[0] = new int[2];
arr2[1] = new int[5];
arr2[2] = new int[9];

for (int i = 0; i < arr2.length; i++) {
    for (int j = 0; j < arr2[i].length; j++) {
        arr2[i][j] = num++;
    }
}
for (int i = 0; i < arr2.length; i++) {
    for (int j = 0; j < arr2[i].length; j++) {
        System.out.print(arr2[i][j] + "\t");
    }
    System.out.println();
}
//	10	11	
//	12	13	14	15	16	
//	17	18	19	20	21	22	23	24	25	
int[][] arr3 = { { 1, 2, 3 }, { 4, 5, 6 } }; // 连着定义带赋初值
for (int i = 0; i < arr3.length; i++) {
    for (int j = 0; j < arr3[i].length; j++) {
        System.out.print(arr3[i][j] + "\t");
    }
    System.out.println();
}
//	1	2	3	
//	4	5	6	

杨辉三角数组存储法

package com.ketang;

public class T07杨辉三角 {
//	0	0	0	1	0	0	0	
//	0	0	1	1	1	0	0	
//	0	1	1	1	1	1	0	
//	1	1	1	1	1	1	1	

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] arr = new int[4][7];

		for (int i = 0; i < arr.length; i++) {
			int start = arr.length - 1 - i;
			for (int j = start; j < 2 * i + 1 + start; j++) {
				arr[i][j] = 1;
			}
		}
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				System.out.print(arr[i][j] + "\t");
			}
			System.out.println();
		}
	}

}

五子棋(稀疏矩阵存储)

  • 二维数组进行记录(棋盘18*18)
  • 使用奇、偶序号区分选手
  • 米子连续满五结束
    • 动子不动盘,单方向可扩展同类型数量和为5则为圣手(三个大方向)

在这里插入图片描述

稀疏矩阵存储:(浪费可耻)

存储:行号、列号、存储数据;

稀疏矩阵的抠门存储

package 数据结构;

import java.util.Arrays;

public class 稀疏数组的存储 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[][] arr1 = new int[18][18];
		arr1[5][9] = 1;
		arr1[10][2] = 2;
		System.out.println("原始数组");
		for (int[] i : arr1) {
			System.out.println(Arrays.toString(i));
		}
		int[][] res = 稀疏矩阵存储(arr1);
		System.out.println("抠门数组");
		for (int i = 0; i < res.length; i++) {
			System.out.println(Arrays.toString(res[i]));
		}
		arr1 = 稀疏矩阵还原(res);
		System.out.println("复原数组");
		for (int[] i : arr1) {
			System.out.println(Arrays.toString(i));
		}
	}

	// 读取抠门存储还原成原来的稀疏矩阵
	public static int[][] 稀疏矩阵还原(int[][] arr) {
		int[][] res = new int[arr[0][0]][arr[0][1]];
		for (int j = 1; j < arr.length; j++) {
			int[] i = arr[j];
			res[i[0]][i[1]] = i[2];
		}
		return res;
	}

	// 稀疏矩阵的抠门存储【【行号,列号,数据】...】
	public static int[][] 稀疏矩阵存储(int[][] arr) {
		int num = 0;
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				if (arr[i][j] > 0) {
					num++;
				}
			}
		}

		int[][] res = new int[num + 1][3];
		res[0][0] = 18;
		res[0][1] = 18;
		res[0][2] = num;
		int count = 1;
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				if (arr[i][j] > 0) {
					res[count][0] = i;
					res[count][1] = j;
					res[count][2] = arr[i][j];
					count++;
				}
			}
		}
		return res;
	}
}

测试结果

原始数组
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
抠门数组
[18, 18, 2]
[ 5,  9, 1]
[10,  2, 2]
复原数组
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


扩展小芝士

  • 折半查找的缺陷:折半查找不稳定(相同值它输出的位置并不是第一个)[参考链接]([折半查找习题解答 - LYLtim - 博客园 (cnblogs.com)](https://www.cnblogs.com/LYLtim/archive/2011/11/09/2243081.html#:~:text=1、本节的折半查找算法有一个特点:如果待查找的元素在数组中有多个则返回其中任意一个,以本节定义的数组 int a %3D { 1%2C 2%2C 2%2C,为例,如果调用 binarysearch (2) 则返回3,即 a ,而有些场合下要求这样的查找返回 a ,也就是说,如果待查找的元素在数组中有多个则返回第一个。)
30	30	37	51	63	72	75	77	82	88	30:1
0	30	30	33	37	49	60	74	74	88	30:1
  • 报错信息从上往下看

  • 分散关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值