LeetCode 第 42 場雙週賽 ( rank 514 / 1578 )

lankerens發表於2020-12-27

LeetCode 第 42 場雙週賽

在這裡插入圖片描述




第一題:5621. 無法吃午餐的學生數量

在這裡插入圖片描述


模擬即可


AC Code

class Solution {
    public int countStudents(int[] stu, int[] sa) {
        int len1 = stu.length, len2 = sa.length;
        int ans = 0;
        // 模擬佇列
        Deque<Integer> queue = new LinkedList<>();
        for(int i = 0; i < len1; i++) queue.addLast(stu[i]);
        int index = 0, cnt = 0;
        
        while(!queue.isEmpty() && cnt != queue.size()) {
            // 遍歷
            int val = queue.pollFirst();
            if(val == sa[index]) {
                index++;
                cnt = 0;
            } else {
                queue.addLast(val);
                cnt++;        
            }
        }
        
        return cnt;
    }
}



第二題: 5622. 平均等待時間

在這裡插入圖片描述


模擬就可


AC Code

class Solution {
    public double averageWaitingTime(int[][] cus) {
        int len = cus.length;
        double sum = cus[0][1];
        int right = cus[0][0] + cus[0][1];
        
        for(int i = 1; i < len; i++) {
            // 大於開始邊界
            if(right > cus[i][0]) {
                right += cus[i][1];
                sum += right - cus[i][0];
            } else {
                right = cus[i][0] + cus[i][1];
                sum += cus[i][1];
            }
        }
        
        return sum / (double)len ;
    }
}



第三題:5623. 修改後的最大二進位制字串

在這裡插入圖片描述


思維題

思路:

會發現遇到1在前面的時候,不需要改為0
我們更希望的時候,當前是0時, 儘可能的將它改為 1

改變的策略有兩種: 00 -> 10 and 10 -> 01

在 01110 中,實際上會發現,在找到第一個0後,根據第二個策略,不斷的將0前移
最後變成 10111 的形式, 實際就是可以理解成消耗第一個 0 後面的 0 , 然後將 第一個 0 向後移動一位, 直到第一個 0 後面沒有 0 了。

最後只需要確定 0 的位置即可。


AC Code

class Solution {
    public String maximumBinaryString(String s) {
        int len = s.length(), cnt1 = 0;
        char[] cs = s.toCharArray();
        for(int i = 0; i < len; i++) if(cs[i] == '1') cnt1++;
        int cnt2 = 0;
        for(int i = 0; i < len; i++) {
            if(cs[i] == '1') cnt2++;
            else break;
        }
        if(cnt1 == len) return s;
        cnt1 -= cnt2;
        
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < len - cnt1 - 1; i++) {
            sb.append('1');
        }
        sb.append('0');
        for(int i = 0; i < cnt1; i++) {
            sb.append('1');
        }
        
        return sb.toString();
    }
}



第四題:5624. 得到連續 K 個 1 的最少相鄰交換次數

在這裡插入圖片描述


待補


AC Code




相關文章