目录
基础知识点
数组
1.定义
- 一维:数据类型[ ] 数组名 = new 数据类型[长度]
- 二维:数据类型[ ][ ] 数组名 = new 数据类型[行数][列数]
2.数组长度
数组名.length
tips:数组的长度是数组的属性,不是方法,因此不需要加括号(所以length()是错误的)
Arrays(java.util.Arrays)
1.排序
Arrays.sort()
● 实现原理
对于基本类型数组,使用双轴快速排序(Dual-Pivot Quicksort),时间复杂度为O(nlogn)
对于对象数组,使用TimSort算法,时间复杂度为O(nlogn)
● 对基本类型数组(如int[ ],double[ ] 等)进行升序排序
● 对对象数组(如String[ ]、Integer[ ]等)进行排序,对象必须实现Comparable接口
● 默认升序排序
● 降序排序
Integerp[ numbers = {5, 3, 9, 1, 6}; // 使用Arrays.sort()和Comparator实现降序排序 Arrays.sort(numbers, Collections.reverseOrder()); System.out.println(Arrays.toString(numbers)); // [9, 6, 5, 3, 1]
tips:
Collection.reverseOrder() 返回一个降序比较器,适用于对象数组(如Integer[ ]、String[ ]),对于基本类型数组(如int[ ] ),需要先将其转换为对象数组(如Integer[ ] )
2.搜索
Arrays.binarySearh()
用于再已排序的数组中查找元素
● 示例
int[] arr = {1,3,5,6,9}; int index = Arrays.binarySearch(arr, 5);
● Tips
数组必须是有序的,否则结果未定义。
如果找到元素,返回元素的索引,否则返回负数。
3.填充
Arrays.fill()
用于用指定值填充数组
● 示例
int [] arr = new int[5]; Arrays.fill(arr, 10); // arr = {10, 10, 10, 10, 10}
4.比较
Arrays.equals()
用于比较两个数组是否相等
● 示例
int[] arr1 = {1, 2, 3}; int[] arr2 = {1, 2, 3}; boolean isEqual = Arrays.equals(arr1, arr2); // isEqual = true;
5.转换
Arrays.toString() 和 Arrays.asList() 是常用的转换方法
● 示例
int[] arr = {1, 2, 3}; String str = Arrays.toString(arr); // str = "[1, 2, 3]" String name = {"Alice", "Bob", "Charlie"}; List<String> list = Arrays.asList(names); // list = ["Alice", "Bob", "Charlie"];
6.复制
Arrays,copyOf() 和 Arrays.copyOfRange() 用于复制数组
● 示例
int[] arr = {1, 2, 3, 4, 5}; int[] copy1 = Arrays.copyOf(arr, 3); // copy1 = {1, 2, 3} int[] copy2 = Arrays.copyOfRange(arr, 1, 4); // copy2 = {2, 3, 4}
● Tips
起始位置 - 终止位置
只写一个参数代表终止位置,起始位置默认为0
左闭右开
字符串和字符数组的相互转换
字符串 --> 字符数组
String类的toCharArray()
String str = "Hello, World!"; char[] ch = str.toCharArray();
字符数组 --> 字符串
使用String的构造函数:通过字符数组创建一个新的String对象
char[] ch = {'H', 'e', 'l', 'l', 'o'}; String str = new String(ch);
使用String.valueOf(char[ ])静态方法
char[] ch = {'H', 'e', 'l', 'l', 'o'}; String str = String.valueOf(ch);
部分数组转换为字符串:构造函数指定起始位置和长度
// 将从索引0开始的5个字符转为字符串 char[] ch = {'H', 'e', 'l', 'l', 'o'}; String str = new String(ch, 0, 5); //
Scanner(Java.util.Scanner)
构造方法
● 从控制台输入
Scanner sc = new Scanner(System.in);
● 从文件输入
Scanner sc = new Scanner(new File("input.txt"));
● 从字符串输入
Scanner sc = new Scanner("Hello World");
读取基本类型
- nextInt():读取一个int类型的值
- nextLong():读取一个Long类型的值
- nextDouble:读取一个double类型的值
- nextFloat():读取一个float类型的值
- nextBoolean():读取一个boolean类型的值
读取字符串
● next():读取一个以空白符分隔的单词
● nextLine():读取一行文本包括空格、换行符
Tips:
● next()会忽略输入中的空白符(如空格、制表符等),而nextLine()会读取整行内容,包括空白符
● 在使用nextLine()之前,如果调用了nextInt()、nextDouble()等方法,需要额外调用一次nextLine()来清除缓冲区
检查输入
- hasNextInt():检查下一个输入是否是int类型
- hasNextDouble():检查下一个输入是否是double类型
- hasNextBoolean():检查下一个输入是否是boolean类型
- hasNextLine():检查是否有下一行输入
使用分隔符
Scanner默认使用空白符(如空格、制表符等)作为分隔符,但可以通过useDelimeter()方法自定义分隔符。
Scanner sc = new Scanner("Apple,Orange,Banana"); sc.useDelimeter(","); // 使用逗号作为分隔符 while (sc.hasNext()) { System.out.println(sc.next()); } // 输出: // Apple // Orange // Banana
关闭Scanner
Scanner类实现了Closeable接口,因此在使用完毕后应调用close()方法释放资源
快速排序
public class Main {
public static void QuickSort(int[] nums, int l, int r) {
if(l >= r) return;
int i = l-1, j = r+1, pivot = nums[(l+r) >> 1];
while(i < j) {
do i++; while(nums[i] < pivot);
do j--; while(nums[j] > pivot);
if(i < j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
QuickSort(nums, l, j);
QuickSort(nums, j+1, r);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++)
nums[i] = sc.nextInt();
QuickSort(nums, 0, n-1);
for(int i = 0; i < n; i++)
System.out.print(nums[i] + " ");
}
}