leetCode每日十题---排序

题目描述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

这题算是个简单题,但还是想说一点,写题目时一定要将想法和演算啥的都用笔记下来,这样才能找到规律。不然的话,很多明明不成立的关系,却认为是限制条件,自己给自己加难度。。。

总结

这次写的题目都比较简单,堆的困难题只写了一半,原因是我想明天周日把一些常用的数据结构及其方法整理出来。当然,会以博客的形式发出来,本来想周日的话就不刷题了,干些其它事,但想想还是算了,虽然要比平常多写一篇总结性质的博客,也应该能挤出刷题的时间。每日十题打卡第九天,以下图为证
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路的苟狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值