• 【leetcode】Weekly Contest 93


      又是周末,leetcode周赛,菜鸡下定决心要AK一次,然后失败了,周常三题QAQ。

    1.Binary Gap

      第一题给一个数字,让你找数字的二进制中相邻的1最大距离是多少,直接扫描一遍就好啦。

     1     public int binaryGap(int N) {
     2         int last = -1;
     3         int res = 0;
     4         for(int i = 0;N>0;N/=2,i++){
     5             if(N%2 == 1){
     6                 if(last!=-1){
     7                     res = Math.max(res, i-last);
     8                 }
     9                 last = i;
    10             }
    11         }
    12         return res;
    13     }

    2.Binary Gap

      第二题也不难,找到与所给的数字位数相同的2^n次方数,然后比较所给的数字构成是不是一样,把每一位拆开来扔进一个10位的int数组里比较就行。因为给的数字最大是10^9,因此直接暴力求即可。

     1     public boolean reorderedPowerOf2(int N) {
     2         for(int i = 0;;i++){
     3             int a = (int)Math.pow(2, i);
     4             int com = compareLength(N, a);
     5             if(com!=1){
     6                 if(com == 0){//找到位数相同的(后来发现好像不加这个条件也可以,反正范围小)
     7                     if(compare(N, a)){
     8                         return true;
     9                     }
    10                 }
    11             }else {
    12                 return false;
    13             }
    14         }
    15     }
    16     
    17     boolean compare(int N,int a){//比较构成是否相同
    18         int[] num = new int[10];
    19         while(N!=0){
    20             num[N%10]++;
    21             N/=10;
    22         }
    23         while(a!=0){
    24             num[a%10]--;
    25             a/=10;
    26         }
    27         for(int i = 0;i<10;i++){
    28             if(num[i] != 0){
    29                 return false;
    30             }
    31         }
    32         return true;
    33     }
    34     
    35     int compareLength(int N,int a){//比较两个数位数是否相同
    36         while(a!=0&&N!=0){
    37             N/=10;
    38             a/=10;
    39         }
    40         if(a!=0){
    41             return 1;
    42         }else if (N!=0) {
    43             return -1;
    44         }
    45         return 0;
    46     }

    3.Advantage Shuffle

      第三题用贪心做就好了,先把A数组排序,对B数组中的每个数B[i],从A数组中找一个最小的并且大于B[i]的数(未被使用过的),如果找不到,就放一个最小的且没被使用过的(有点像田忌赛马的感觉),举个例子A【1,5】,B【2,3】,对于这种数组,5放在第一位和第二位都是一样的,因此无需考虑某个位置放的数是否会对后面放置数字产生影响。

     1     public int[] advantageCount(int[] A, int[] B) {
     2         Arrays.sort(A);
     3          int temp;
     4         for(int i = 0,j=A.length-1;i<j;i++,j--){//sort从小到大,翻转一下QAQ
     5             temp = A[i];
     6             A[i] = A[j];
     7             A[j] = temp;
     8         }
     9         int[] C = new int[A.length];
    10         Arrays.fill(C, -1);
    11         boolean[] use = new boolean[A.length];
    12         for(int i = 0;i<A.length;i++){
    13             for(int j = A.length-1;j>=0;j--){
    14                 if(!use[j] && A[j]>B[i]){
    15                     C[i] = A[j];
    16                     use[j] = true;
    17                     break;
    18                 }
    19             }
    20             if(C[i] == -1){
    21                 for(int j = A.length-1;j>=0;j--){
    22                     if(!use[j]){
    23                         C[i] = A[j];
    24                         use[j] = true;
    25                         break;
    26                     }
    27                 }
    28             }
    29         }
    30         return C;
    31     }

    4.Minimum Number of Refueling Stops

      题目不难理解,一开始用贪心做了,后来发现贪心会出现问题,可能前面的加油站加油是能到达目标点的,但是贪心只考虑当前能到最远的位置,就可能会出现一些傻傻的答案。然后看了一下时间不多啦,就没怎么思考尝试dfs求解了,虽然感觉会超时,不过最终真的超时啦!

      后来补题的时候呢,发现别人写的好简洁QAQ,自己学着码了一个。

     1     public int minRefuelStops(int target, int startFuel, int[][] stations) {
     2         Queue<Integer> queue = new PriorityQueue<>();
     3         int d = startFuel;
     4         int last = 0;
     5         int res = 0;
     6         while(true){
     7             for(;last<stations.length&&d>=stations[last][0];last++){//从前往后找到加了res次油后能到达的位置
     8                 queue.offer(-stations[last][1]);//优先队列默认小根堆,加个负号就能少写一个比较器,这他喵的也太聪明了吧
     9             }
    10             if(d>=target){
    11                 return res;
    12             }
    13             if(queue.isEmpty()){
    14                 return -1;
    15             }
    16             d += -queue.poll();
    17             res++;
    18         }
    19     }
  • 相关阅读:
    C++中四种类型转换方式
    LeetCode——Move Zeroes
    LeetCode——Construct the Rectangle
    LeetCode——Add Digits
    LeetCode—— Invert Binary Tree
    LeetCode——Sum of Two Integers
    LeetCode——Find the Difference
    LeetCode——Maximum Depth of Binary Tree
    kafka 安装及部署
    apache kafka系列之server.properties配置文件参数说明
  • 原文地址:https://www.cnblogs.com/zzzdp/p/9313002.html
Copyright © 2020-2023  润新知