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

thấy thiên hạ hơn 2k người giải được q4, thôi em lặn 1 thời gian để tu đây :cautious: bao giờ lên guardian em quay lại voz =((
13p xong 3q nhưng TLE ở q4 đần vc
 
Q3: đếm số chữ số theo từng hàng, từ hàng đơn vị lên hàng chục, hàng trăm,...
Ở mỗi hàng, đếm xong nếu thấy có m chữ số i, n chữ số j (với i khác j) thì result += m * n...

Q4: Sau m lần nhảy lên và n lần đi xuống thì sẽ dừng ở bậc thang 1 + 2^0 + 2^1 + ... + 2^(m-1) - n = 2*m - n
=> Với mỗi giá trị m tính n để 2*m - n = k rồi tính xem có bao nhiêu cách để nhảy lên m lần và đi xuống n lần (lưu ý: không được đi xuống 2 lần liên tục)
Bác làm hay thật, để e nghiên cứu code theo cách này
 
Q3: đếm số chữ số theo từng hàng, từ hàng đơn vị lên hàng chục, hàng trăm,...
Ở mỗi hàng, đếm xong nếu thấy có m chữ số i, n chữ số j (với i khác j) thì result += m * n...

Q4: Sau m lần nhảy lên và n lần đi xuống thì sẽ dừng ở bậc thang 1 + 2^0 + 2^1 + ... + 2^(m-1) - n = 2*m - n
=> Với mỗi giá trị m tính n để 2*m - n = k rồi tính xem có bao nhiêu cách để nhảy lên m lần và đi xuống n lần (lưu ý: không được đi xuống 2 lần liên tục)
Q3 mà đếm result m*n thì phải xử lí trùng mệt lắm, nên mình xài one pass luôn.
Thường mấy bài mà tìm pair i, j thì chỉ cần duyệt 1 lần rồi lưu vô counter để khỏi phải xử lí trùng thôi.
 
Ừ đúng rồi fence, thực ra nhảy lên 2^i thì i chỉ có 9 thôi, thêm cái boolean nữa thì dp 3 chiều là dễ dàng.
Bài 3 dễ mà giải bài 2 tốn tgian quá gang thật, biết là xài prefixSum rồi mà quên mẹ mất cách biến đổi, khuya rồi đầu óc thật sự rất ngáo =((
Em cũng dính hai bọ bài 2, tạo 1 mảng cộng dồn: count = số cặp liền nhau "lỗi" từ 0 ->i. Rồi đem so sánh count[l] === count[r-1].
 
Q4 solution siêu ngắn mà nghĩ hơn 1 tiếng không ra. Mình nghi nghi dùng DP nhưng lại cứ đi theo hướng Math, thế là tạch.
 
Q3 mà đếm result m*n thì phải xử lí trùng mệt lắm, nên mình xài one pass luôn.
Thường mấy bài mà tìm pair i, j thì chỉ cần duyệt 1 lần rồi lưu vô counter để khỏi phải xử lí trùng thôi.
Không cần xử lý trùng ý anh, result += m*n là được đó. Counter bác đếm cũng là m*n mà
 
lần đầu tham dự, bị tle bài 2 ạ
c3eixZM.gif
 
Q3 mà đếm result m*n thì phải xử lí trùng mệt lắm, nên mình xài one pass luôn.
Thường mấy bài mà tìm pair i, j thì chỉ cần duyệt 1 lần rồi lưu vô counter để khỏi phải xử lí trùng thôi.
Nó trùng là do cặp (i,j) (j,i) được đếm là 2 cặp riêng biệt. Trong khi bài này thì chỉ là 1 cặp. Nên sau khi đếm hết, result trả về chia 2 là xong. Code bài 3 của t đây
Python:
class Solution:
    def sumDigitDifferences(self, nums: List[int]) -> int:
        c = defaultdict(int)
        for num in nums:
            for i, d in enumerate(str(num)):
                c[(i,d)] += 1
        ret = 0
        for v in c.values():
            ret += v * (len(nums) - v)
        return ret//2
 
câu cuối mình thấy khó mà 2k người giải được ư =((
Câu cuối mình nghĩ lý do có khoảng 2k người giải được vì bài này chỉ cần hiểu được công thức tính vị trí sau một số lần nhảy là ra, không yêu cầu implement bất kỳ thuật toán nào phức tạp :LOL:)
 
Câu cuối mình nghĩ lý do có khoảng 2k người giải được vì bài này chỉ cần hiểu được công thức tính vị trí sau một số lần nhảy là ra, không yêu cầu implement bất kỳ thuật toán nào phức tạp :LOL:)
Bài này khó ở chỗ đưa ra được nhận xét mà bạn nêu ra (sử dụng nhị thức Newton). Còn cài đặt thì ko quá phức tạp.
 
Back
Top