来源:1502. 判断能否形成等差数列 - 力扣(LeetCode)
题目
给你一个数字数组 arr
。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true
;否则,返回 false
。
示例 1:
输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:
输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。
提示:
2 <= arr.length <= 1000
-10^6 <= arr[i] <= 10^6
详解
思路
此题非常简单,只需将数组排序,再计算一个公差即可判断是否为等差数列
class Solution {
public boolean canMakeArithmeticProgression(int[] arr) {
//对数组进行sort排列
Arrays.sort(arr);
int diff = arr[1] - arr[0];
for (int i = 2; i < arr.length; i++) {
if (arr[i] - arr[i - 1] != diff) {
return false;
}
}
return true;
}
}
Arrays工具类(常用方法详解)
Arrays
类提供了许多用于操作数组的静态方法。以下是一些常见的方法及其示例:
1. 排序
-
sort(T[] a)
: 对数组进行升序排序。int[] arr = {5, 2, 8, 3, 1}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
-
sort(T[] a, Comparator<? super T> c)
: 根据指定的比较器对数组进行排序。String[] names = {"Alice", "Bob", "Charlie"}; Arrays.sort(names, Comparator.comparingInt(String::length)); System.out.println(Arrays.toString(names)); // 输出: [Bob, Alice, Charlie]
-
parallelSort(T[] a)
: 使用并行排序对数组进行升序排序。int[] arr = {5, 2, 8, 3, 1}; Arrays.parallelSort(arr); System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
2. 搜索
-
binarySearch(T[] a, T key)
: 使用二分搜索在升序数组中搜索指定的元素。int[] arr = {1, 2, 3, 5, 8}; int index = Arrays.binarySearch(arr, 3); System.out.println(index); // 输出: 2
-
binarySearch(T[] a, T key, Comparator<? super T> c)
: 使用二分搜索在升序数组中搜索指定的元素,使用指定的比较器。String[] names = {"Alice", "Bob", "Charlie"}; int index = Arrays.binarySearch(names, "Bob", Comparator.naturalOrder()); System.out.println(index); // 输出: 1
3. 复制
-
copyOf(T[] original, int newLength)
: 复制指定的数组,返回一个新数组,长度为newLength
。int[] arr = {1, 2, 3, 4, 5}; int[] newArr = Arrays.copyOf(arr, 3); System.out.println(Arrays.toString(newArr)); // 输出: [1, 2, 3]
-
copyOfRange(T[] original, int from, int to)
: 复制指定范围的数组,返回一个新数组。int[] arr = {1, 2, 3, 4, 5}; int[] newArr = Arrays.copyOfRange(arr, 1, 4); System.out.println(Arrays.toString(newArr)); // 输出: [2, 3, 4]
4. 转换
-
asList(T... a)
: 返回一个由指定数组支持的固定大小的列表。String[] names = {"Alice", "Bob", "Charlie"}; List<String> list = Arrays.asList(names); System.out.println(list); // 输出: [Alice, Bob, Charlie]
-
toString(T[] a)
: 返回数组的字符串表示形式。int[] arr = {1, 2, 3, 4, 5}; String str = Arrays.toString(arr); System.out.println(str); // 输出: [1, 2, 3, 4, 5]
5. 填充
-
fill(T[] a, T val)
: 用指定的值填充整个数组。int[] arr = new int[5]; Arrays.fill(arr, 7); System.out.println(Arrays.toString(arr)); // 输出: [7, 7, 7, 7, 7]
-
fill(T[] a, int fromIndex, int toIndex, T val)
: 用指定的值填充数组的指定范围。int[] arr = {1, 2, 3, 4, 5}; Arrays.fill(arr, 1, 4, 0); System.out.println(Arrays.toString(arr)); // 输出: [1, 0, 0, 0, 5]
6. 其他
-
equals(T[] a, T[] a2)
: 比较两个数组是否相等。int[] arr1 = {1, 2, 3}; int[] arr2 = {1, 2, 3}; boolean isEqual = Arrays.equals(arr1, arr2); System.out.println(isEqual); // 输出: true
-
hashCode(T[] a)
: 返回数组的哈希码。int[] arr = {1, 2, 3}; int hashCode = Arrays.hashCode(arr); System.out.println(hashCode); // 输出: 哈希码
-
stream(T[] a)
: 返回一个顺序流,其元素是数组的元素。int[] arr = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(arr); stream.forEach(System.out::println); // 输出: 1 2 3 4 5
7. 升序排序
-
sort(int[] a)
: 对整数数组进行升序排序。int[] arr = {5, 2, 8, 3, 1}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
-
binarySearch(int[] a, int key)
: 使用二分搜索在升序数组中搜索指定的元素。int[] arr = {1, 2, 3, 5, 8}; int index = Arrays.binarySearch(arr, 3); System.out.println(index); // 输出: 2
8.降序排序
- Array.sort(arr,Comparator.reverseOrder()):结合自定义的比较器。
Integer[] arr = {5, 2, 8, 3, 1};
// 使用自定义比较器进行降序排序
Arrays.sort(arr, Comparator.reverseOrder());
System.out.println(Arrays.toString(arr)); // 输出: [8, 5, 3, 2, 1]
需要注意的是,Comparator.reverseOrder()
适用于对象数组(如Integer[]
),而不适用于基本数据类型数组(如int[]
)。如果你使用的是基本数据类型数组,可以先将其转换为对象数组,排序后再转回基本数据类型数组,或者使用Java 8的流(Stream)API来实现降序排序。
以下是使用流API对基本数据类型数组进行降序排序的示例:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {5, 2, 8, 3, 1};
// 使用流API进行降序排序
arr = Arrays.stream(arr)
.boxed()
.sorted(Comparator.reverseOrder())
.mapToInt(Integer::intValue)
.toArray();
System.out.println(Arrays.toString(arr)); // 输出: [8, 5, 3, 2, 1]
}
}
在这个示例中,我们首先将int[]
数组转换为IntStream
,然后使用boxed()
方法将其转换为Stream<Integer>
,接着使用sorted(Comparator.reverseOrder())
进行降序排序,最后再通过mapToInt(Integer::intValue)
和toArray()
方法将其转换回int[]
数组。
9. 填充多维数组
fill(T[][] a, T val)
: 用指定的值填充整个二维数组。int[][] matrix = new int[3][3]; Arrays.fill(matrix, 7); for (int[] row : matrix) { System.out.println(Arrays.toString(row)); // 输出: [7, 7, 7] // [7, 7, 7] // [7, 7, 7] }
10. 排序多维数组
sort(T[][] a)
: 对二维数组的每个子数组进行排序。int[][] matrix = {{5, 2, 8}, {3, 1, 4}, {7, 6, 9}}; for (int[] row : matrix) { Arrays.sort(row); } for (int[] row : matrix) { System.out.println(Arrays.toString(row)); // 输出: [2, 5, 8] // [1, 3, 4] // [6, 7, 9] }
11. 检查数组是否包含某个元素
binarySearch(T[] a, T key)
: 检查数组是否包含某个元素(需先排序)。int[] arr = {1, 2, 3, 4, 5}; boolean contains = Arrays.binarySearch(arr, 3) >= 0; System.out.println(contains); // 输出: true
12. 使用流进行复杂操作
stream(T[] a)
: 使用流进行复杂操作,例如过滤、映射、归约等。int[] arr = {1, 2, 3, 4, 5}; int sum = Arrays.stream(arr).filter(n -> n % 2 != 0).sum(); System.out.println(sum); // 输出: 9 (奇数之和)
13. 并行流操作
parallelStream(T[] a)
: 使用并行流进行高效处理。int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sum = Arrays.parallelStream(arr).map(n -> n * 2).sum(); System.out.println(sum); // 输出: 110 (每个元素乘以2后求和)
14. 数组转换为集合
asList(T... a)
: 将数组转换为列表,然后进行集合操作。String[] names = {"Alice", "Bob", "Charlie"}; List<String> list = Arrays.asList(names); list.add("David"); // 抛出 UnsupportedOperationException,因为 asList 返回的是固定大小的列表
15. 使用setAll
和replaceAll
-
setAll(T[] a, IntFunction<T> generator)
: 使用生成器函数设置数组的所有元素。int[] arr = new int[5]; Arrays.setAll(arr, i -> i * i); System.out.println(Arrays.toString(arr)); // 输出: [0, 1, 4, 9, 16]
-
replaceAll(T[] a, UnaryOperator<T> operator)
: 使用操作符替换数组的所有元素。int[] arr = {1, 2, 3, 4, 5}; Arrays.replaceAll(arr, n -> n * 2); System.out.println(Arrays.toString(arr)); // 输出: [2, 4, 6, 8, 10]
16. 使用copyOf
和copyOfRange
处理多维数组
-
copyOf(T[][] original, int newLength)
: 复制二维数组。int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[][] newMatrix = Arrays.copyOf(matrix, 2); for (int[] row : newMatrix) { System.out.println(Arrays.toString(row)); // 输出: [1, 2, 3] // [4, 5, 6] }
-
copyOfRange(T[][] original, int from, int to)
: 复制二维数组的指定范围。int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[][] newMatrix = Arrays.copyOfRange(matrix, 1, 3); for (int[] row : newMatrix) { System.out.println(Arrays.toString(row)); // 输出: [4, 5, 6] // [7, 8, 9] }