1. 力扣1122:数组的相对排序
1.1 题目:
给你两个数组,arr1
和 arr2
,arr2
中的元素各不相同,arr2
中的每个元素都出现在 arr1
中。
对 arr1
中的元素进行排序,使 arr1
中项的相对顺序和 arr2
中的相对顺序相同。未在 arr2
中出现过的元素需要按照升序放在 arr1
的末尾。
示例 1:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19]
示例 2:
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6] 输出:[22,28,8,6,17,44]
提示:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2
中的元素arr2[i]
各不相同arr2
中的每个元素arr2[i]
都出现在arr1
中
1.2 思路:
for循环暴力破解。
1.3 题解:
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int k = 0;
int[] nums = new int[arr1.length];
// 两层for循环,从arr1中找到那些是出现在arr2中的元素,将其放入nums数组中
for(int i = 0; i < arr2.length; i++) {
for(int j = 0; j < arr1.length; j++){
if(arr2[i] == arr1[j]){
nums[k++] = arr1[j];
}
}
}
// 临时数组,用来存储arr1数组中不存在于arr2中的元素
int[] temp = new int[arr1.length - k];
int l = 0;
// 两层for循环找到arr1数组中不存在于arr2中的元素
for(int i = 0; i < arr1.length; i++){
boolean flag = true;
for(int j= 0; j < arr2.length; j++) {
if(arr1[i] == arr2[j]){
flag = false;
break;
}
}
if(flag){
temp[l++] = arr1[i];
}
}
// 调用API排序
Arrays.sort(temp);
// 然后添加到nums数组的末尾
for(int i = 0; i < temp.length; i++){
nums[k++] = temp[i];
}
return nums;
}
}
2. 力扣1636:按照频率将数组升序排序
2.1 题目:
给你一个整数数组 nums
,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。
示例 1:
输入:nums = [1,1,2,2,2,3] 输出:[3,1,1,2,2,2] 解释:'3' 频率为 1,'1' 频率为 2,'2' 频率为 3 。
示例 2:
输入:nums = [2,3,1,3,2] 输出:[1,3,3,2,2] 解释:'2' 和 '3' 频率都为 2 ,所以它们之间按照数值本身降序排序。
示例 3:
输入:nums = [-1,1,-6,4,5,-6,1,4,1] 输出:[5,-1,4,4,-6,-6,1,1,1]
提示:
1 <= nums.length <= 100
-100 <= nums[i] <= 100
2.2 思路:
Arrays.sort这个方法在传入自定义比较器形参的时候,第一个形参的类型是Object[],就是说不能把一个int[]类型的数组直接传入会报错。所以把数组的数都放入list集合中,再设计一个比较器。
2.3 题解:
class Solution {
public int[] frequencySort(int[] nums) {
HashMap<Integer, Integer> hashmap = new HashMap<>();
for(int i : nums) {
if(!hashmap.containsKey(i)){
hashmap.put(i, 1);
}else {
hashmap.put(i, hashmap.get(i)+1);
}
}
List<Integer> list = new ArrayList<>();
for (int i : nums){
list.add(i);
}
Collections.sort(list, (a, b) -> {
int i = hashmap.get(a);
int j = hashmap.get(b);
return i != j ? i - j : b - a;
});
for(int i = 0; i < nums.length; i++) {
nums[i] = list.get(i);
}
return nums;
}
}