常见算法

目录

 

一、数组中涉及的常见算法

1.杨辉三角

2.回形数

3.最大值、最小值、平均数、总和

4.复制、反转、查找(线性查找、二分法查找)

 


一、数组中涉及的常见算法

数组元素的赋值(杨辉三角、回形数等)

求数值型数组中元素的最大值、最小值、平均数、总和等

数组的复制、反转、查找(线性查找、二分法查找)

 数组元素的排序算法

1.杨辉三角

package day06;

/*
 * 使用二维数组打印一个十行的杨辉三角
 * 
 * 【提示】
 * 1.第一行有1个元素,第n行有n个元素
 * 2.每一行的第一个元素和最后一个元素都是1
 * 3.从第三行开始,对于非第一个元素的最后一个元素的元素。即:
 * yanghui[i][j] = yanghui[i-1][j-1] +yanghui[i-1][j];
 * 
 * */
public class Demo {
	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] =yangHui[i][i] = 1;
			//2.2给每行的非首末元素赋值
			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();
		}
	}
}

2.回形数

package day06;

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 
		输入数字4, 则程序输出: 
		1   2   3   4 
		12  13  14  5 
		11  16  15  6 
		10   9  8    7
		*/
public class Demo {
	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();
		}
	}
}

 

3.最大值、最小值、平均数、总和

package day06;

/*
 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
 * 要求:所有随机数都是两位数:
 * 
 * [10,99]
 * 公式:(int) (Math.random() * (99 - 10 + 1) + 10);
 * */
public class Demo {
	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] + "    ");
		}

		// 求数组的最大值
		int num = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (num < arr[i]) {
				num = arr[i];
			}
		}
		System.out.println("\n" + "最大值为:" + num);

		// 求数组的最小值
		int num2 = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (num2 > arr[i]) {
				num2 = arr[i];
			}
		}
		System.out.println("\n" + "最小值为:" + num2);

		// 求数组的总和
		double num3 = 0;
		for (int i = 1; i < arr.length; i++) {
			num3 += arr[i];
		}
		System.out.println("\n" + "总和为:" + num3);
		
		// 求数组的平均数
		double num4 =0;
		num4 = num3 / arr.length;
		System.out.println("\n" + "平均数为:" + num4);
	}
}

4.复制、反转、查找(线性查找、二分法查找)

package day06;

/*
 * 数组的复制、反转、查找(线性查找、二分法查找)
 * 
 * */
public class Demo {
	public static void main(String[] args) {

		String[] arr = new String[] { "AA", "BB", "CC", "DD" };

		// 数组变量的赋值
		String[] arr1 = arr; // (修改arr1,arr会跟着变化),arr和arr1有相同的地址值指向同一个堆数据
		arr1[0] = "AAA";
		System.out.println(arr[0]); // AAA

		// 数组的复制(区别于数组变量的赋值:arr1 = arr)
		String[] arr3 = new String[arr.length];
		for (int i = 0; i < arr.length; i++) {
			arr3[i] = arr[i];
		}

		// 数组的反转

		// 方法一:
		for (int i = 0; i < arr3.length / 2; i++) {
			String temp = arr[i];
			arr[i] = arr[arr.length - i - 1];
			arr[arr.length - i - 1] = temp;
		}

		// 方法二:
		for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
			String temp2 = arr[i];
			arr[i] = arr[j];
			arr[j] = temp2;
		}

		// 遍历
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i] + "\t");
		}

		// 查找
		// 线性查找:
		String dest = "C";

		boolean isFlag = true;

		for (int i = 0; i < arr.length; i++) {
			if (dest.equals(arr[i])) {
				System.out.println("找到了指定的元素,位置为" + i);
				isFlag = false;
				break;
			}
		}
		if (isFlag == true) {
			System.out.println("没有找到指定元素!");
		}

		// 二分法查找:
		// 前提:索要查找的数组必须有序----有序
		int[] arr2 = new int[] {1,2,3,4,5,6,7,8,9,10,11,12,16,18,84,99};

		int dest1 = 77;
		int start = 0;// 初始的首索引
		boolean isFlag2 = true;
		int end = arr2.length - 1;// 初始的末索引

		while (start <= end) {
			int middle = (start + end) / 2;

			if (dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为" + middle);
				isFlag2 = false;
				break;
			} else if (arr2[middle] > dest1) {
				end = middle - 1;
			} else {
				start = middle + 1;
			}
		}
		if (isFlag2 == true) {
			System.out.println("没有找到指定元素!");
		}
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值