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 数组的练习题
- 猜数游戏。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;
}
}
- 数组的逆序
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;
}
}
- 编写一个程序,提示用户输入学生数量后,再依次输入姓名和成绩,按照成绩的降序来打印学生的姓名
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;
}
}
}
}
}
- 编写一个程序,能够读入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,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
-
报错信息从上往下看
-
分散关注