thảo luận Leetcode contest, đường tới Guardian

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Ui bạn @Violet_7 mới ra trường thôi à, siêu thế.
Thời kỳ này đúng là cứ phải full-stack vì thế giới đang ở giai đoạn biến đổi mạnh VUCA. Kiến thức hôm nay hôm sau đã lỗi thời.
Làm mười mấy năm ở cấp độ manager rồi, kỹ năng gần như full hết các thứ nhưng mình cũng vẫn phải học hỏi hàng ngày.
Chơi leetcode nó cũng như chơi cờ, để mình sáng tạo và ứng dụng không ngừng. Mỗi bài contest nó mới và không lặp lại cũng như công việc trong thực tế không biết trước được.
ông này giỏi leetcode thì học AI, BigData, Data Science, Games luôn chứ web gì nữa.
 
1705965662256.png

Đang tập luyện để đọc thật kĩ đề, xong rồi khi nào prove được là nó đúng mới bắt đầu code + chạy tay trước khi submit để thi contests. Mấy contests gần đây toang là do toàn phức tạp hoá vấn đề + ko đọc kĩ đề lao vào code ngay nên code ẩu quá toàn toang =((
Nếu bình tĩnh + dùng pattern từ trước giờ học thì giải 3/4 bài contests cũng ko khó lắm, thi contests thời gian nó rush quá nên hồi hộp làm sai vl. Trong khi giải bài random medium bình thường thì hầu như bài nào cũng giải được trừ mấy bài medium-hard bit manipulation =((
 
Bài thành phố contest xong mới để ý những thằng nào ở trong vòng thì có 2 chiều tính distance nên bị hớ mà không hiểu sao sai =))))))
 
Mình mới tham gia leetcode được 1 tháng. A e cho hỏi là giải khoảng bao nhiêu bài leetcode thì mới nên bắt đầu contest vậy? Hiện giờ mình mới giải được khoảng 90 bài thôi.
 
Mình mới tham gia leetcode được 1 tháng. A e cho hỏi là giải khoảng bao nhiêu bài leetcode thì mới nên bắt đầu contest vậy? Hiện giờ mình mới giải được khoảng 90 bài thôi.
bao nhiêu chả đc bác. Kiểu gì chả được 1-2 câu :D. Trước ko làm câu nào mà cx lên 1k4 points :sweat:
 
Tuần này ko làm contests với anh em được rồi, có cái tiệc tất niên của sếp ko huỷ được =((
 

Mấy thằng này ko phải người nữa rồi đm nó =((
Có numb3r5 với NealWu có quay quá trình giải bài lên Youtube đấy bác =))) Xem thì rút ra hai cái là:
1. Bọn này suy luận nghĩ nhanh vl, cụ thể như bài giảm độ dài dãy bằng cách lấy phần dư thì nghĩ ra giải thuật rất nhanh, hơn hẳn mình =((
2. Sử dụng template có sẵn cho các thuật toán và cấu trúc dữ liệu. Numb3r5 có chia sẻ bộ template cho C++ luôn nếu anh em nào cần dùng để tăng tốc độ giải bài nhé =)))
 
Bỏ cuộc câu cuối tiếp cho khoẻ. Vẫn chưa bao h làm đc câu 8 điểm :cry:
câu này nhìn ý tưởng khả năng greedy để làm mất bit theo thứ tự ưu tiên bit 29 -> bit 0 phải merge cái đầu tiên có bit i -> cái cuối cùng có bit i hoặc merge thêm 1 trong 2 cái neighbor bên cạnh của 2 cái border mà em chịu không biết implement sao luôn. Anh có ý tưởng gì không :beat_brick:
 
câu này nhìn ý tưởng khả năng greedy để làm mất bit theo thứ tự ưu tiên bit 29 -> bit 0 phải merge cái đầu tiên có bit i -> cái cuối cùng có bit i hoặc merge thêm 1 trong 2 cái neighbor bên cạnh của 2 cái border mà em chịu không biết implement sao luôn. Anh có ý tưởng gì không :beat_brick:
Định dùng heap rồi pop các số lớn nhất rồi AND các số bên cạnh mà chắc greedy kiểu này sai r :sad:
 
câu này nhìn ý tưởng khả năng greedy để làm mất bit theo thứ tự ưu tiên bit 29 -> bit 0 phải merge cái đầu tiên có bit i -> cái cuối cùng có bit i hoặc merge thêm 1 trong 2 cái neighbor bên cạnh của 2 cái border mà em chịu không biết implement sao luôn. Anh có ý tưởng gì không :beat_brick:
cái này bị edge case nếu có 2 số lớn nhất kề nhau :confuse:
 
Câu 4: tham lam
Ta sẽ ưu tiên xóa các bit có "ý nghĩa hơn" các bit khác, điều này là vì 2 ^ i > 1 + 2 + .. + 2 ^ (i - 1)
Ở mỗi bước ta sẽ cố cập nhật các bit có thể xóa vào một mask và check xem liệu có thể làm mất mask với không quá k operation không.
Chi tiết ở trong implement

Python:
class Solution:
    def minOrAfterOperations(self, nums: List[int], k: int) -> int:
        n = len(nums)

        def can_off(mask):
            # check xem mask hiện tại có thể được xóa không
            cur = (1 << 30) - 1
            
            # giả định rằng ban đầu ta cần nối tất cả các phần tử lại với nhau và nối thêm 1 số 0 để
            # chắc chắn mask biến mất => cần n - 1 + 1 = n thao tác
            need = n
            
            # ta chỉ quan tâm đến các bit 1 trong mask
            tmp = [x & mask for x in nums]
            
            for x in tmp:
                cur = cur & x
                
                if cur == 0:
                    cur = (1 << 30) - 1
                    need -= 1 # ta không cần nối i với i + 1 nữa
            
            return need <= k
        
        mask = 0
        
        #tham lam, nếu thêm được bit nào vào mask thì ta sẽ thêm theo thứ tự ưu tiên 29 xuống 0
        for i in range(29,-1,-1):
            if can_off(mask | (1 << i)):
                mask |= 1 << i
        
        return (1 << 30) - 1 - mask
 
Bài Q2 bị loạn cái case [1,1,1,1,1]. Chỉ nghĩ ra được cách dùng HashMap để tính.

C#:
public class Solution {
    public int MaximumLength(int[] nums) {
        Dictionary<int,int> dic = new Dictionary<int,int>();
        HashSet<int> hash = new HashSet<int>();
        for(int i = 0; i < nums.Length;i++)
        {
            if(dic.ContainsKey(nums[i]))
            {
                dic[nums[i]]++;
            }
            else
            {
                dic.Add(nums[i], 1);
            }
        }
        int ans = 1;
        foreach (var item in dic)
        {
            if(hash.Contains(item.Key))
                continue;
            int ans1 = 0;
            int key = item.Key;
            bool hasMid = false;
            while (dic.ContainsKey(key))
            {
                if (key == 1)
                {
                    ans1 = (dic[key] / 2) * 2;
                    if (dic[key] % 2 == 1) 
                        hasMid = true;
                    break;
                }
                if (dic[key] > 1)
                {
                    hash.Add(key);
                    ans1 += 2;
                    key *= key;
                }
                else
                {
                    hasMid = true;
                    break;
                }
            }
            ans1 += hasMid ? 1 : -1;
            ans = Math.Max(ans, ans1);
        }
        return ans;
    }
}
}
 
Sửa lần cuối:
Câu 4: tham lam
Ta sẽ ưu tiên xóa các bit có "ý nghĩa hơn" các bit khác, điều này là vì 2 ^ i > 1 + 2 + .. + 2 ^ (i - 1)
Ở mỗi bước ta sẽ cố cập nhật các bit có thể xóa vào một mask và check xem liệu có thể làm mất mask với không quá k operation không.
Chi tiết ở trong implement

Python:
class Solution:
    def minOrAfterOperations(self, nums: List[int], k: int) -> int:
        n = len(nums)

        def can_off(mask):
            # check xem mask hiện tại có thể được xóa không
            cur = (1 << 30) - 1
          
            # giả định rằng ban đầu ta cần nối tất cả các phần tử lại với nhau và nối thêm 1 số 0 để
            # chắc chắn mask biến mất => cần n - 1 + 1 = n thao tác
            need = n
          
            # ta chỉ quan tâm đến các bit 1 trong mask
            tmp = [x & mask for x in nums]
          
            for x in tmp:
                cur = cur & x
              
                if cur == 0:
                    cur = (1 << 30) - 1
                    need -= 1 # ta không cần nối i với i + 1 nữa
          
            return need <= k
      
        mask = 0
      
        #tham lam, nếu thêm được bit nào vào mask thì ta sẽ thêm theo thứ tự ưu tiên 29 xuống 0
        for i in range(29,-1,-1):
            if can_off(mask | (1 << i)):
                mask |= 1 << i
      
        return (1 << 30) - 1 - mask
Ghê zậy. Elite uet có khác :sweet_kiss:. Chiều ngân cứu thử
 
1706458559539.png

Hôm qua bận không join được về virtual làm bù, submit q2 sai 3 lần do code lỗi chứ không về được 1k rồi =((
Câu 2 với câu 3 đợt này dễ. nhưng mà câu 2 thì khó hơn câu 3, câu 4 thì 8 điểm nên thôi bỏ qua
Cơ hội vàng để cải thiện rank mà ko join được rồi :ah:

Python:
class Solution:
    def maximumLength(self, nums: List[int]) -> int:
        counts = {}
        def getLength(counts, num):
            if num == 1:
                if counts[1]%2 == 0:
                    return counts[1] - 1
                else:
                    return counts[1]
           
            length = 1
            previousNum = num
            num = int(math.sqrt(num))
            while counts.get(num, 0) >= 2 and num > 1 and num*num == previousNum:
                previousNum = num
                num = int(math.sqrt(num))
                length += 2
               
            return length
     
        for num in nums:
            counts[num] = counts.get(num, 0) + 1
       
        ans = 0
        for num in nums:
            ans = max(ans, getLength(counts, num))
           
        return ans
Python:
class Solution:
    def flowerGame(self, n: int, m: int) -> int:
        mNumOdds = 0
        mNumEvens = 0
        for num in range(1, m + 1):
            if num%2 == 0:
                mNumEvens +=1
            else: mNumOdds +=1
       
        ans = 0
        for num in range(1, n + 1):
            if num%2 == 0:
                ans += mNumOdds
            else: ans += mNumEvens
           
        return ans
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
freedom.9,
Trả lời
2.480
Lượt xem
130.319
Quay lại
Lên đầu trang