数组中的常见算法
1.数组元素的赋值(杨辉三角、回形数等)
练习1:打印回形数
这个题简直不要太恶心
方式一
package com.atguigu.exer;
import java.util.Scanner;
/*
* 回形数格式方阵的实现
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
public class HuiXingTest {
public static void main(String[] args){
//1.获得用户输入的值,创建一个二维数组
Scanner scanner = new Scanner(System.in);
int len = scanner.nextInt();
int[][] arr = new int[len][len];
//2.定义需要做判断的值
int k = 1; // 右 == 1,下 == 2,左 == 3; 上 == 4
int i = 0; //行
int j = 0; //列
int sum = len*len; //总数
//3.
for(int m = 1; m <= sum; m++){
if(k==1){
if(j<len&&arr[i][j]==0){
arr[i][j++] = m;
}else{
k = 2;
i++;
j--;
m--;
continue;
}
}else if(k==2){
if(i<len&&arr[i][j]==0){
arr[i++][j] = m;
}else{
k = 3;
j--;
i--;
m--;
continue;
}
}else if(k==3){
if(j>=0&&arr[i][j]==0){
arr[i][j--] = m;
}else{
k = 4;
i--;
j++;
m--;
continue;
}
}else if(k==4){
if(i>=1&&arr[i][j]==0){
arr[i--][j] = m;
}else{
k = 1;
j++;
i++;
m--;
continue;
}
}
}
//3.输出测试
for(int v = 0; v < arr.length; v++){
for(int x = 0; x < arr[i].length; x++){
System.out.print(arr[v][x] + " ");
}
System.out.println();
}
}
}
方式二
package com.atguigu.exer;
public class HuiXingTest01 {
public static void main(String[] args){
//1.定义初始值
int n = 6;
int[][] arr = new int[n][n];
int m = 0; //要存入到数组中的数字
int maxX = n - 1; //最大X轴
int maxY = n - 1; //最大Y轴
int minX = 0; //最小X轴
int minY = 0; //最小Y轴
//2.进行数组填充
while(minX<=maxX){
for(int x = minX; x <= maxX; x++){
arr[minY][x] = ++m;
}
minY++;
for(int y = minY; y <= maxY; y++){
arr[y][maxX] = ++m;
}
maxX--;
for(int x = maxX; x >= minX; x--){
arr[maxY][x] = ++m;
}
maxY--;
for(int y = maxY; y >= minY; y--){
arr[y][minX] = ++m;
}
minX++;
}
//3.输出测试
for(int v = 0; v < arr.length; v++){
for(int l = 0; l < arr[v].length; l++){
System.out.print(arr[v][l] + " ");
}
System.out.println();
}
}
}
2.求数值型数组中元素的最大值、最小值、平均数、总和等
练习1:打印一维数组中的最大值、最小值、总和、平均值
package com.atguigu.exer;
/*
* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
* 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来
*/
public class ArrayTest01 {
public static void main(String[] args) {
int[] arr = new int[] { 12, 64, 23, 45, 67, 86, 54, 23, 65, 90 };
//1.选出最大值
int max = arr[0];
for(int i = 1; i < arr.length; i++){
if(max < arr[i]){
max = arr[i];
}
}
System.out.println("最大值:" + max);
//2.选出最小值
int min = arr[0];
for(int i = 1; i < arr.length; i++){
if(min > arr[i]){
min = arr[i];
}
}
System.out.println("最小值:" + min);
//3.总和
int sum = 0;
for(int i = 0; i < arr.length; i++){
sum += arr[i];
}
System.out.println("总和:" + sum);
//4.平均值
System.out.println("平均值" + (sum/arr.length));
}
}
3.数组的复制、反转、查找(线性查找、二分法查找)
练习1:复制、反转
package com.atguigu.exer;
import java.util.Arrays;
/*
* 反转数组
*/
public class ArrayTest02 {
public static void main(String[] args){
int[] arr = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
for(int i = 0,j = arr.length - 1; i < arr.length/2; i++,j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
练习2:线性查找和二分查找
package com.atguigu.exer;
public class ArrayTest03 {
public static void main(String[] args) {
int[] arr = new int[] { -34, -23, -10, -4, 0, 3, 12, 23, 54, 123 };
//1.线性查找
int dest = 233;
boolean isFlag = true;
for(int i = 0; i < arr.length; i++){
if(arr[i]==dest){
System.out.println("目标在:" + i);
isFlag = false;
break;
}
}
if(isFlag){
System.out.println("没有找到");
}
System.out.println("==========================");
//2.二分查找:要求数组必须是有序的
int dest1 = 23;
int start = 0;
int end = arr.length-1;
boolean isFlags = true;
while(start < end){
int center = (end + start)/2;
if(arr[center] == dest1){
System.out.println("找到了:" + center);
isFlags = false;
break;
}else if(arr[center] > dest1){
end = center - 1;
}else{
start = center + 1;
}
}
if(isFlags){
System.out.println("没有找到");
}
}
}
4.数组元素的排序算法
练习1:冒泡排序
package com.atguigu.exer;
import java.util.Arrays;
/*
* 冒泡排序
*/
public class ArrayTest04 {
public static void main(String[] args){
//1.创建数组
int[] bubbling = new int[]{4,10,-1,-23,-4,23,21,12,54,64,-34,123,53,63};
//2.冒泡排序
for(int i = 0; i < bubbling.length - 1; i++){
for(int j = 0; j < bubbling.length - 1 - i; j++){
if(bubbling[j] > bubbling[j+1]){
int temp = bubbling[j];
bubbling[j] = bubbling[j+1];
bubbling[j+1] = temp;
}
}
}
//3.输出测试
System.out.println(Arrays.toString(bubbling));
}
}
练习2:快速排序
Arrays工具类
练习1:找出最大值与最小值并调换位置
package com.atguigu.java;
import java.util.Arrays;
/*
* 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
*/
public class ArrayDemo05 {
public static void main(String[] args) {
int[] arr = new int[] { 134, 2465, 13, 34, -1, 343, -23, 9, 0, 43 };
int min = 0;
int max = 0;
//选出最大值与最小值
for(int i = 1; i < arr.length; i++){
if(arr[i] < arr[min]){
min = i;
}
if(arr[i] > arr[max]){
max = i;
}
}
//2.调整位置
int temp1 = arr[max];
arr[max] = arr[0];
arr[0] = temp1;
int temp2 = arr[min];
arr[min] = arr[arr.length-1];
arr[arr.length-1] = temp2;
//3.测试
System.out.println(arr[0] + " " + arr[arr.length-1]);
System.out.println(Arrays.toString(arr));
}
}
练习2:打印斐波那契数列
package com.atguigu.java;
import java.util.Arrays;
/*
* 用数组求出斐波那契数列的前20项值
*/
public class ArrayDemo06 {
public static void main(String[] args){
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
int index = 2;
//1.循环赋值
for(int i = 0; i < arr.length - 2; i++){
int j = i + 1;
arr[index] = arr[i] + arr[j];
index++;
}
//2.打印测试
System.out.println(Arrays.toString(arr));
}
}