数组中涉及的常见算法
1、数组元素的赋值(杨辉三角、回形数等)
2、求数值型数组中元素的最大值、最小值、平均数、总和等
3、数组的复制、反转、查找(线性查找、二分法查找)
4、数组元素的排序算法
第一类问题:数组元素的赋值(杨辉三角、回形数等)的练习
练习一、创建一个长度为6的int型数组 要求:数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。
方法一
class Test {
public static void main(String[] args) {
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
arr[i] = (int) (Math.random() * 30) + 1;
boolean flag = false;
while (true) {
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
flag = true;
break;
}
}
if (flag) {
arr[i] = (int) (Math.random() * 30) + 1;
flag = false;
continue;
}
break;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
方法二:
class Test {
public static void main(String[] args) {
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
arr[i] = (int) (Math.random() * 30) + 1;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
i--;
break;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
练习二、 杨辉三角
使用二维数组打印一个10行的杨辉三角。
【提示】
1、第一行有1个元素,第n行有n个元素
2、每一行的第一个元素和最后一个元素都是1
3、从第三行开始,对于非第一个元素和最后一个元素的元素。即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
实现这个问题分为三步骤:
1.声明并初始化二维数组
2.给数组的元素赋值
3.遍历二维数组
public class YangHuiTest {
public static void main(String[] args) {
//1.声明并初始化二维数组,应该用动态初始化
int[][] yangHui = new int[10][];//后面的空格中不能写,因为每行的列不一样。
//2.给数组的元素赋值
for(int i = 0;i < yangHui.length;i++){
yangHui[i] = new int[i + 1];
//2.1 给首末元素赋值
yangHui[i][0] = 1;
yangHui[i][i] = 1;
//上面两行可以合并为yangHui[i][0] = yangHui[i][i] = 1;
//2.2 给每行的非首末元素赋值
//if(i > 1){if可以不写,因为如果i=1时,
//下面的for中yangHui[i].length - 1结果为0,无法进入循环。所以可以省略
for(int j = 1;j < yangHui[i].length - 1;j++){
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
}
//}
}
//3.遍历二维数组
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~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
方式一
import java.util.*;
class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("输入要输出的回行针行数:");
int n = scanner.nextInt();
//System.out.println("\n");
System.out.println("\n你所要输出的回行针行数为:"+n+"行\n");
int[][] arr = new int[n][n];
int count = 0; // 要显示的数据
int maxX = n - 1; // x轴的最大下标
int maxY = n - 1; // Y轴的最大下标
int minX = 0; // x轴的最小下标
int minY = 0; // Y轴的最小下标
while (minX <= maxX) {
for (int x = minX; x <= maxX; x++) {
arr[minY][x] = ++count;
}
minY++;
for (int y = minY; y <= maxY; y++) {
arr[y][maxX] = ++count;
}
maxX--;
for (int x = maxX; x >= minX; x--) {
arr[maxY][x] = ++count;
}
maxY--;
for (int y = maxY; y >= minY; y--) {
arr[y][minX] = ++count;
}
minX++;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
String space = (arr[i][j] + "").length() == 1 ? "0" : "";
System.out.print(space + arr[i][j] + " ");
}
System.out.println();
}
}
}
方式二
import java.util.*;
class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入要输出的回行针行数");
int len = scanner.nextInt();
int[][] arr = new int[len][len];//创建二维数组
int s = len * len;
//k = 1:向右 k = 2:向下 k = 3:向左 k = 4:向上
int k = 1;
int i = 0, j = 0;
for (int m = 1; m <= s; m++) {
if (k == 1) {
if (j < len && arr[i][j] == 0) {
arr[i][j++] = m;
} else {
k = 2;
i++;
j--;
m--;
}
} else if (k == 2) {
if (i < len && arr[i][j] == 0) {
arr[i++][j] = m;
} else {
k = 3;
i--;
j--;
m--;
}
} else if (k == 3) {
if (j >= 0 && arr[i][j] == 0) {
arr[i][j--] = m;
} else {
k = 4;
i--;
j++;
m--;
}
} else if (k == 4) {
if (i >= 0 && arr[i][j] == 0) {
arr[i--][j] = m;
} else {
k = 1;
i++;
j++;
m--;
}
}
}
// 遍历
for (int m = 0; m < arr.length; m++) {
for (int n = 0; n < arr[m].length; n++) {
System.out.print(arr[m][n] + "\t");
}
System.out.println();
}
}
}
算法的考察,第二类问题:
求数值型数组中元素的最大值、最小值、平均数、总和等
练习四:
定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
- 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
- 要求:所有随机数都是两位数。
[10,99] - 公式:(Math.random() * (99 - 10 + 1) + 10)
因为random得到的是一个double型的值,现在要一个整型的。所以要在前面加int
公式:(int)(Math.random() * (99 - 10 + 1) + 10) - 推理公式过程
Math.random():[0.0,1)
Math.random()*90:[0.0,90.0)
(int)(Math.random()*90):[0,89]
(int)(Math.random()*90 + 10):[10,99] - 公式:获取[a,b]范围的随机数: (int)(Math.random()*(b-a+1))+a
class Test{
public static void main(String[ ] args){
int[] arr = new int[10];
for(int i = 0;i < arr.length;i++){
arr[i]=(int)(Math.random() * (99 - 10 + 1) + 10);
}
//遍历随机数,并将其显示出来
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + "\t");
}
System.out.println();
//求数组元素的最大值
int maxValue = arr[0];
for(int i = 0;i < arr.length;i++){
if(maxValue < arr[i]){
maxValue = arr[i];
}
}
System.out.println("最大值为:" + maxValue);
//求数组元素的最小值
int minValue = arr[0];
for(int i = 0;i < arr.length;i++){
if(minValue > arr[i]){
minValue = arr[i];
}
}
System.out.println("最小值为:" + minValue);
//求数组元素总和
int sum = 0;
for(int i = 0;i < arr.length;i++){
sum+=arr[i];
}
System.out.println("总和为:" + sum);
//求数组元素的平均数
int avg = sum / arr.length;
System.out.println("平均数:" + avg);
}
}