题目描述1
笔者解答1.1
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
HashSet<Integer> set=new HashSet<Integer>();
int[] match=new int[arr1.length];
for(int i=0;i<arr1.length;i++)
match[i]=0;
for(int i=0;i<arr1.length;i++){
map.put(arr1[i],map.getOrDefault(arr1[i],0)+1);
}
for(int i=0;i<arr2.length;i++){
set.add(arr2[i]);
}
PriorityQueue<Integer> queue=new PriorityQueue<>();
for(Integer i:map.keySet()){
if(!set.contains(i)){
queue.offer(i);
}
}
int[] str=new int[arr1.length];
int count=0;
for(int i=0;i<arr2.length;i++){
int j=map.get(arr2[i]);
for(;j>0;j--){
str[count]=arr2[i];
count++;
}
}
for(int i=count;i<arr1.length;){
int temp=queue.poll();
int j=map.get(temp);
for(;j>0;j--){
str[i]=temp;
i++;
}
}
return str;
}
}
笔者分析1.2
现在还没有从堆的阴影中走出来,看到什么题都会想到用数据结构,所以,这题虽然简单,我的第一反应还是用数据结构,当然了,无论是时间还是空间,效率都不高。没有花时间去想更好的方法,只是花时间去想如何实现当前已有的笨方法。下面看下比较简单的方法,说实话,在刷了90道leetcode题以前,我的惯用思路就是这样的。。。
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] nums = new int[1001];
int[] res = new int[arr1.length];
//遍历arr1,统计每个元素的数量
for (int i : arr1) {
nums[i]++;
}
//遍历arr2,处理arr2中出现的元素
int index = 0;
for (int i : arr2) {
while (nums[i]>0){
res[index++] = i;
nums[i]--;
}
}
//遍历nums,处理剩下arr2中未出现的元素
for (int i = 0; i < nums.length; i++) {
while (nums[i]>0){
res[index++] = i;
nums[i]--;
}
}
return res;
}
题目描述2
笔者解答2.1
class Solution {
public String minNumber(int[] nums) {
int i,j;
PriorityQueue<Integer> queue=new PriorityQueue<>((o1,o2)->{
String str1=""+o1+""+o2;
String str2=""+o2+""+o1;
return str1.compareTo(str2);
});
for(i=0;i<nums.length;i++)
queue.offer(nums[i]);
String str="";
while(!queue.isEmpty())
str+=""+queue.poll();
return str;
}
}
笔者分析2.2
这题算是个简单题,但还是想说一点,写题目时一定要将想法和演算啥的都用笔记下来,这样才能找到规律。不然的话,很多明明不成立的关系,却认为是限制条件,自己给自己加难度。。。
总结
这次写的题目都比较简单,堆的困难题只写了一半,原因是我想明天周日把一些常用的数据结构及其方法整理出来。当然,会以博客的形式发出来,本来想周日的话就不刷题了,干些其它事,但想想还是算了,虽然要比平常多写一篇总结性质的博客,也应该能挤出刷题的时间。每日十题打卡第九天,以下图为证