30天搞定Java--day7

每日一考和复习

每日一考

  1. 写出一维数组初始化的两种方式
// 静态初始化
int[]arr1 = {1,2,3,4};
int[] arr2 = new int[]{5,6,7,8};
// 动态初始化
String[] str1 = new String[5];
  1. 写出二维数组初始化的两种方式
// 静态初始化
int[][] arr3 = {{1,2},{3,4,5}};
int[][] arr4 = new int[][]{{1,2},{3,4,5}};
// 动态初始化
String[][] str2 = new String[5][3];
String[][] str3 = new String[5][];
  1. 如何遍历如下的二维数组
int[] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};
for(int i = 0;i<arr.length;i++) {
	for (int j = 0;j<arr[i].length;j++) {
		System.out.println(arr[i][j]);
	}
}
  1. 不同类型的一维数组元素的默认初始化值各是多少
类型		值
char	0或空(不是‘0)
byte	0
short	0
int		0
long	0L
float	0.0F
double	0.0
Boolean	false
String	null
  1. 一维数组的内存解析:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];

在这里插入图片描述复习
day6的学习内容

数组(接day6)

数组中涉及到的常见算法

题目一:杨辉三角

/*
 * 使用二维数组打印一个 10 行杨辉三角。

【提示】
 1. 第一行有 1 个元素, 第 n 行有 n 个元素
 2. 每一行的第一个元素和最后一个元素都是 1
 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
 * 
 */
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] = yangHui[i][i] = 1;
			// 2.2 给每行的非首末元素赋值
			// if(i > 1){
			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();
		}
	}
}

题目二:随机数组按需求值

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

		// 求数组元素的最小值
		int minValue = arr[0];
		for (int i = 1; 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);
		// 求数组元素的平均数
		double avgValue = (double)sum / arr.length;
		System.out.println("平均数为:" + avgValue);
	}
}

题目三:数组复制

/*
 * 使用简单数组
(1)创建一个名为ArrayExer2的类,在main()方法中声明array1和array2两个变量,
   他们是int[]类型的数组。
(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
(3)显示array1的内容。
(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
   (如array[0]=0,array[2]=2)。打印出array1。
 * 
 * 思考:array1和array2是什么关系?
 * array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。
 * 拓展:修改题目,实现array2对array1数组的复制
 */
public class ArrayExer2 {
	public static void main(String[] args) { // alt + /
		int[] array1, array2;

		array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };

		// 显示array1的内容
		for (int i = 0; i < array1.length; i++) {
			System.out.print(array1[i] + "\t");
		}

		// 赋值array2变量等于array1
		// 不能称作数组的复制。
		array2 = array1;

		// 修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		for (int i = 0; i < array2.length; i++) {
			if (i % 2 == 0) {
				array2[i] = i;
			}

		}
		System.out.println();
		// 打印出array1
		for (int i = 0; i < array1.length; i++) {
			System.out.print(array1[i] + "\t");
		}
	}
}
/*
 * 使用简单数组
 * 拓展:修改题目,实现array2对array1数组的复制
 */
public class ArrayExer3 {
	public static void main(String[] args) { // alt + /
		int[] array1, array2;

		array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };

		// 显示array1的内容
		for (int i = 0; i < array1.length; i++) {
			System.out.print(array1[i] + "\t");
		}

		// 数组的复制:
		array2 = new int[array1.length];
		for (int i = 0; i < array2.length; i++) {
			array2[i] = array1[i];
		}

		// 修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)
		for (int i = 0; i < array2.length; i++) {
			if (i % 2 == 0) {
				array2[i] = i;
			}
		}
		System.out.println();
		// 打印出array1
		for (int i = 0; i < array1.length; i++) {
			System.out.print(array1[i] + "\t");
		}
	}
}

题目四:数组的复制、反转、查找

/*
 * 算法的考查:数组的复制、反转、查找(线性查找、二分法查找)
 * 
 */
public class ArrayTest2 {

	public static void main(String[] args) {

		String[] arr = new String[] { "JJ", "DD", "MM", "BB", "GG", "AA" };

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

		// 数组的反转
		// 方法一:
		for(int i = 0;i < arr.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 temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}

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

		System.out.println();
		// 查找(或搜索)
		// 线性查找:
		String dest = "BB";
		dest = "CC";

		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) {
			System.out.println("很遗憾,没有找到的啦!");
		}
		// 二分法查找:(熟悉)
		// 前提:所要查找的数组必须有序。
		int[] arr2 = new int[] { -98, -34, 2, 34, 54, 66, 79, 105, 210, 333 };

		int dest1 = -34;
		dest1 = 35;
		int head = 0;// 初始的首索引
		int end = arr2.length - 1;// 初始的末索引
		boolean isFlag1 = true;
		while (head <= end) {

			int middle = (head + end) / 2;

			if (dest1 == arr2[middle]) {
				System.out.println("找到了指定的元素,位置为:" + middle);
				isFlag1 = false;
				break;
			} else if (arr2[middle] > dest1) {
				end = middle - 1;
			} else {// arr2[middle] < dest1
				head = middle + 1;
			}
		}

		if (isFlag1) {
			System.out.println("很遗憾,没有找到的啦!");
		}
	}
}

排序算法

  • 排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新排序为{Ri1,Ri2,…,Rin},使得相应的关键字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序
  • 通常来说,排序的目的是快速查找
  • 衡量排序算法的优劣
  1. 时间复杂度:分析关键字的比较次数和记录的移动次数
  2. 空间复杂度:分析排序算法中需要多少辅助内存
  3. 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的
    排序算法分类:内部排序和外部排序
    • 内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成
    • 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成

十大排序算法

  • 选择排序
    • 直接选择排序、堆排序
  • 交换排序(要求手写)
    • 冒泡排序、快速排序
  • 插入排序
    • 直接插入排序、折半插入排序、Shell排序
  • 归并排序
  • 桶式排序
  • 基数排序

冒泡排序

/*
 * 数组的冒泡排序的实现
 * 
 */
public class BubbleSortTest {
	public static void main(String[] args) {
		int[] arr = new int[] { 43, 32, 76, -98, 0, 64, 33, -21, 32, 99 };
		// 冒泡排序
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + "\t");
		}
	}
}

快速排序(暂时了解)

/*
 * 快速排序
 * 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,
 * 则分别对这两部分继续进行排序,直到整个序列有序。
 */
public class QuickSort {
	private static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

	private static void subSort(int[] data, int start, int end) {
		if (start < end) {
			int base = data[start];
			int low = start;
			int high = end + 1;
			while (true) {
				while (low < end && data[++low] - base <= 0);
				while (high > start && data[--high] - base >= 0);
				if (low < high) {
					swap(data, low, high);
				} else {
					break;
				}
			}
			swap(data, start, high);

			subSort(data, start, high - 1);// 递归调用
			subSort(data, high + 1, end);
		}
	}

	public static void quickSort(int[] data) {
		subSort(data, 0, data.length - 1);
	}

	public static void main(String[] args) {
		int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		quickSort(data);
		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
	}
}

Arrays工具类的使用

常用方法

方法名 作用
boolean equals(int[] a,int[] b) 判断两个数组是否相等
String toString(int[] a) 输出数组信息
void fill(int[] a,int val) 将指定值填充到数组之中
void sort(int[] a) 对数组进行排序
int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值
import java.util.Arrays;
/*
 * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
 * 
 * 
 */
public class ArraysTest {
	public static void main(String[] args) {

		// 1.boolean equals(int[] a,int[] b):判断两个数组是否相等。
		int[] arr1 = new int[] { 1, 2, 3, 4 };
		int[] arr2 = new int[] { 1, 3, 2, 4 };
		boolean isEquals = Arrays.equals(arr1, arr2);
		System.out.println(isEquals);

		// 2.String toString(int[] a):输出数组信息。
		System.out.println(Arrays.toString(arr1));

		// 3.void fill(int[] a,int val):将指定值填充到数组之中。
		Arrays.fill(arr1, 10);
		System.out.println(Arrays.toString(arr1));

		// 4.void sort(int[] a):对数组进行排序。
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2));

		// 5.int binarySearch(int[] a,int key)
		int[] arr3 = new int[] { -98, -34, 2, 34, 54, 66, 79, 105, 210, 333 };
		int index = Arrays.binarySearch(arr3, 210);
		if (index >= 0) {
			System.out.println(index);
		} else {
			System.out.println("未找到");
		}
	}
}

数组使用中的常见异常

package com.atguigu.java;

/*
 * 数组中的常见异常:
 * 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
 * 
 * 2. 空指针异常:NullPointerException
 * 
 */
public class ArrayExceptionTest {
	public static void main(String[] args) {
		// 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
		int[] arr = new int[] { 1, 2, 3, 4, 5 };

		for(int i = 0;i <= arr.length;i++){
			System.out.println(arr[i]);
		}

		System.out.println(arr[-2]);
		System.out.println("hello");

		// 2. 空指针异常:NullPointerException
		// 情况一:
		int[] arr1 = new int[]{1,2,3};
		arr1 = null;
		System.out.println(arr1[0]);

		// 情况二:
		int[][] arr2 = new int[4][];
		System.out.println(arr2[0][0]);

		// 情况三:
		String[] arr3 = new String[] { "AA", "BB", "CC" };
		arr3[0] = null;
		System.out.println(arr3[0].toString());
	}
}
发布了16 篇原创文章 · 获赞 27 · 访问量 2710

猜你喜欢

转载自blog.csdn.net/weixin_42224119/article/details/105110639