thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
UKiCiKh.png
Nay chắc ko có thời gian leetcode rồi, học job mới ngập mặt
UKiCiKh.png
Hẹn thím tháng sau
mới pvan hôm qua nay đi làm luôn r à, nhanh quá v
AsBPJOY.png
 
Swift:
class Solution {
    func canArrange(_ arr: [Int], _ k: Int) -> Bool {
        guard k > 1 else { return true }
        let arr = arr.map{ 
            var num = $0%k
            if num < 0 {
                num += k
            }
            return num
        }
        var dict:[Int:Int] = [:]
        for num in arr {
            dict[num, default:0] += 1
        }
        var half = k/2
        if 2*half == k {
            if let count = dict[half], count%2 == 1 {
                return false
            }
            half -= 1
        }
        if let count = dict[0], count%2 == 1 {
            return false
        }
        guard k > 2 else { return true }
        for num in 1...half {
            if dict[num, default:0] != dict[k-num, default:0] {
                return false
            }
        }
        return true
    }
}
 
Java:
class Solution {
    public boolean canArrange(int[] arr, int k) {
        Map<Integer, Integer> remain = new HashMap<>();
        for (int num : arr) {
            int rem = ((num % k) + k) % k;
            int count = remain.getOrDefault(rem, 0);
            remain.put(rem, count + 1);
        }
        for (int num : arr) {
            int r = ((num % k) + k) % k;
            if (r == 0) {
                if (remain.get(r) % 2 != 0) return false;
            }
            else if (!remain.get(r).equals(remain.get(k - r))) return false;
        }
        return true;
    }
}
 
ông larry giải từ từ chậm chậm mà chắc phết nhỉ, bài sliding window tuần trước cũng giải hết 40p, thua cả vozer nhưng mà contest nào cũng 4/4
AsBPJOY.png
Cơ bản là mấy ông biết mình có trình độ nên bình tĩnh giải, bình tĩnh debug vl, biết cách tối ưu nữa. Mà 4/4 mấy ông 2k7 2k8 đổ lên phải vô top 100 200 chứ tụt rank sml

via theNEXTvoz for iPhone
 
Cơ bản là mấy ông biết mình có trình độ nên bình tĩnh giải, bình tĩnh debug vl, biết cách tối ưu nữa. Mà 4/4 mấy ông 2k7 2k8 đổ lên phải vô top 100 200 chứ tụt rank sml

via theNEXTvoz for iPhone
Như mình Vozlit loanh quanh 2k cứ giải 3Q là đủ quota rồi :D. Tuần nào giải được 4Q thì vui còn không đến Q4 bí quá tắt máy đi chơi. Cá biệt có vài tuần Q3 cũng không đớp được :(
 
Nếu mục tiêu chỉ để phỏng vấn thì có thể follow theo roadmap của những ng đã từng thành công, trong thớt này cũng có nhiều bạn chia sẻ rồi.

Roadmap mình đề xuất:

1. (1-2 ngày) Big O notation: Cái này là cực kì quan trọng khi làm LC. Phải nắm rõ và có thói quen est đc độ phức tạp của mọi thứ mình làm trong 1 nốt nhạc. Kĩ năng này cần phải luyện tập nhiều nhưng cần dành thời gian tập luyện trước cho vững rồi củng cố dần dần.

2. (14-21 ngày) Cấu trúc dữ liệu căn bản: Học 1 lượt về các cấu trúc dữ liệu căn bản, các thao tác trên CTDL đó và độ phức tạp tương ứng. Hiểu được CTDL nào thì nên dùng lúc nào với bài toán nào. Mục tiêu là làm đc 3-4 bài level super easy cho mỗi CTDL. Có thể sử dụng LC Study Plan cho phần này (https://leetcode.com/study-plan/data-structure/). CTDL căn bản gồm:
  • Mảng
  • Hashtable / Hash Map / Hash Set
  • Stack / queue
  • Linked list
  • Tree các thể loại
  • Graph các thể loại

3. (7 - 14 ngày) Thuật toán căn bản: Học các thuật toán cơ bản thường dùng, và tập phân tích độ phức tạp của mỗi chi phí. Tương tự, mục tiêu là hoàn thành đc 3-4 bài mỗi topic mức độ easy. Bao gồm:
  • Tìm kiếm nhị phân
  • Tìm kiếm tuyến tính
  • Sort: (Quick, merge, heap, count, radix)
  • Prefix sum
  • Đệ quy
  • DFS / BFS

4. (14 - 21 ngày) Đào sâu vào các CTDL nâng cao theo chuyên đề. Vẫn là CTDL nhưng làm các bài medium (5-6 bài mỗi topic) và học thêm các CTDL nâng cao hơn như Trie, Segment Tree,...

5. (21 - 30 ngày) Tương tự nhưng đào sâu vào các thuật toán nâng cao, mỗi topic làm đc 4-5 bài medium. Giai đoạn này mới thực sự là bắt đầu grinding:
  • Sliding window
  • Two pointers
  • Backtracking
  • Monotonic stack / queue
  • Math & Bitwise
  • Geometry
    • Graph algorithms
  • Dynamic programming

6. (7 - 14 ngày) Làm ngẫu nhiên. Qua bước 5 thì thím đã khá vững vàng để chiến đấu rồi, bước tiếp theo là làm ngẫu nhiên các bài level medium (hoặc hard luôn) mà không biết trước chủ đề để tập vận dụng các kiến thức linh hoạt. Mỗi ngày làm 1-3 bài liên tục tầm 1-2 tuần là đc.

7. (Vô chừng) FAANG: Hết bước 6 chỉ cho các bác vào đc cái cty top tier ở VN thôi, để vào FAANG mình nghĩ là cần phải done được các bài hard trong khoản thời gian dưới 45p. Nó khó vkl và mình cũng k chắc là làm được nên k biết chỉ sao.

Cuối cùng, đừng dành hết thời gian vào để cày LC nếu chỉ vì muốn pass phỏng vấn, vì:
  • Phỏng vấn còn rất nhiều phần khác, LC chỉ là cánh cửa đầu tiên. Nếu nói ra nó chiếm đc khoảng 30% kết quả phỏng vấn của các bác thôi.
  • Dù là thuật toán, thì cái code / solution cũng chỉ chiếm được 40% trong cái 30% đó thôi, 60% còn lại là:
    • Cách phát triển vấn đề, tư duy để tìm ra giải pháp
    • Cách code, có gọn gàng sạch đẹp không, có suy nghĩ đc các edge case k, gặp vấn đề cách debug như thế nào
    • Cách trình bày: Phải giải thích được code & ý tưởng của mình cho interviewer hiểu. Nếu không tất cả cũng vô nghĩa
  • Cuối cùng, LC chả giúp gì nhiều trong công việc thực tế, nếu sau khi pass pv xong bạn fail probation thì cũng vậy cả.
p/s: Mình vẫn ở VN, trước mắt cũng k có ý định relocate sang nc ngoài làm việc. Mình làm LC vì sở thích chứ cũng k có mục tiêu vào cty nào.
Cám ơn bác nha

via theNEXTvoz for iPhone
 
Python:
class Solution:
    def canArrange(self, arr: List[int], k: int) -> bool:
        d = defaultdict(int)
        for a in arr:
            mod = a % k
            remain = k - mod if mod != 0 else 0
            if remain in d and d[remain] > 0:
                d[remain] -= 1
            else:
                d[mod] += 1
        for v in d.values():
            if v > 0:
                return False
        return True

Python:
class Solution:
    def canArrange(self, arr: List[int], k: int) -> bool:
        
        return (sum(arr) % k == 0) and min(arr) < k/2 and max(arr) > k/2
 
điểm cmn danh :ah:
Java:
class Solution {
    public boolean canArrange(int[] arr, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int n:arr){
            int mod = (n%k+k)%k;
            int mod2 = (k-mod)%k;
            if(map.containsKey(mod2)){
                int count = map.get(mod2);
                if(count ==1)
                    map.remove(mod2);
                else
                    map.put(mod2,count-1);
            }else
                map.put(mod,map.getOrDefault(mod,0)+1);
        }
        if(map.size()==0)
            return true;
        return false;
    }
}
 
@freedom.9 Thím có thể cho e vài tips live coding không ạ. Em ít kinh nghiệm phần live code này, lần gần đây nhất live code thì e bị run và under perform. Cảm ơn thím :pudency:
Edit: T5 này e live code =((
 
JavaScript:
/**
 * @param {number[]} arr
 * @param {number} k
 * @return {boolean}
 */
var canArrange = function (arr, k) {
    const C = Array(k + 69).fill(0);
    let c = 0;
    for (const n of arr) {
        const u = (n % k + k) % k, v = k - u;
        if (!u || u === v) {
            c += (C[u] ^= 1) ? 1 : -1;
            continue;
        }
        if (C[v] > C[u]) {
            C[v]--;
            c--;
        } else {
            C[u]++;
            c++;
        }
    }
    return !c;
};
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.215.683
Quay lại
Lên đầu trang