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.
có 2 điểm ko ngờ thoy mà có gì khó đâu
JiZo9zf.png
tự tìm hiểu não mới to bằng người viết được
g8XXj8u.gif
trừ cái code inverse square root gì ra ko tự hiểu được thoy
pzGVwuf.png

Thử mò đi. Ý tưởng của cái code đó là apply 1 step của Newton method.
 
Bài hôm này bằng Elixir
hkNtitg.png


Mã:
defmodule Solution do
  def is_power_of_four(n) when n <= 0, do: false
  def is_power_of_four(1), do: true
  def is_power_of_four(n) when rem(n, 4) != 0, do: false
  def is_power_of_four(n), do: n |> div(4) |> is_power_of_four()
end
 
có 2 điểm ko ngờ thoy mà có gì khó đâu
JiZo9zf.png
tự tìm hiểu não mới to bằng người viết được
g8XXj8u.gif
trừ cái code inverse square root gì ra ko tự hiểu được thoy
pzGVwuf.png
Không đồng tình với quan điểm tự tìm hiểu lắm.

Với cái leetcode này trừ khi làm vì sở thích và đam mê còn nếu làm để đi phỏng vấn thì cách cày là đọc cách giải liên tục mới cram được nhiều trong thời gian ngắn.
Theo quan điểm của tui cách cày leetcode là:
1. Mua premium membership của thằng leetcode hoặc algo expert
2. Ngày luyện tầm 10 câu trở lên (tính cả những câu đã làm rồi giờ làm lại).
3. Cho mỗi câu 15 phút suy nghĩ thôi. Nếu suy nghĩ không ra hướng thì đọc đáp án cho bằng hiểu (cái này có membership premium bọn nó sẽ giải thích dễ hiểu hơn từng bước). Sau đó implement lại đáp án mà không nhìn vào đáp án nữa.
4. Cứ lặp đi lặp lại như vậy cho đến khi nhớ được cách giải của càng nhiều bài càng tốt. Đến lúc phỏng vấn thì trúng tủ là đỗ không trúng tủ là trượt. (Mấy đứa giỏi hơn thì "hơi trúng tủ" bọn nó cũng đỗ vì nó đầu óc hơn nên biết biến đổi về dạng quen thuộc. Dạng này không nhiều và hầu hết là IOI với ACM rồi)

Theo quan điểm của tui thì đây là lý do khiến cho nhiều ông làm FAANG mà đi phỏng vấn không phải đỗ 90% trở lên được. Nhiều ông trên LinkedIn còn "khoe" là trượt cả chục lần FAANG mới đỗ. Rồi đừng bỏ cuộc các thứ...

Nói chung là phải cày nhiều để trúng tủ, vậy nên tự tìm hiểu thì đến tám kiếp mới cày đủ để tăng xác xuất trúng tủ...
 
Cách giải không cần loop, không cần hàm hỗ trợ (__builtin_clz là một instruction có sẵn, gọi trực tiếp assembly thay vào cũng được). Test n in array bản chất vẫn là loop rồi.

C++:
    bool isPowerOfFour(int n) {
        auto lg2 = n > 0 ? sizeof(n)*8 - 1 - __builtin_clz(n) : -1;
        return n > 0 && (lg2 % 2 == 0) && ((1LL << lg2) == n);
    }

Cách khác:

C++:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & (n-1) == 0) && (n & 0x55555555));
    }
Giải thích: để là lũy thừa của 4 thì cần:
  • Lớn hơn 0
  • Là lũy thừa của 2. Tức biểu diễn nhị phân có dạng 1000...000. Khi đó n & (n-1) == 10...000 & 01...111 = 0
  • Bit 1 phải nằm ở vị trí lẻ. Số 0x55555555 có biểu diễn nhị phân là 010101...01, khi and với n sẽ trả về khác 0 nếu trong n có 1 bit ở vị trí lẻ.
đoạn trên sao ko dùng __builtin_ctz cho nhanh bác
 
Không đồng tình với quan điểm tự tìm hiểu lắm.

Với cái leetcode này trừ khi làm vì sở thích và đam mê còn nếu làm để đi phỏng vấn thì cách cày là đọc cách giải liên tục mới cram được nhiều trong thời gian ngắn.
Theo quan điểm của tui cách cày leetcode là:
1. Mua premium membership của thằng leetcode hoặc algo expert
2. Ngày luyện tầm 10 câu trở lên (tính cả những câu đã làm rồi giờ làm lại).
3. Cho mỗi câu 15 phút suy nghĩ thôi. Nếu suy nghĩ không ra hướng thì đọc đáp án cho bằng hiểu (cái này có membership premium bọn nó sẽ giải thích dễ hiểu hơn từng bước). Sau đó implement lại đáp án mà không nhìn vào đáp án nữa.
4. Cứ lặp đi lặp lại như vậy cho đến khi nhớ được cách giải của càng nhiều bài càng tốt. Đến lúc phỏng vấn thì trúng tủ là đỗ không trúng tủ là trượt. (Mấy đứa giỏi hơn thì "hơi trúng tủ" bọn nó cũng đỗ vì nó đầu óc hơn nên biết biến đổi về dạng quen thuộc. Dạng này không nhiều và hầu hết là IOI với ACM rồi)

Theo quan điểm của tui thì đây là lý do khiến cho nhiều ông làm FAANG mà đi phỏng vấn không phải đỗ 90% trở lên được. Nhiều ông trên LinkedIn còn "khoe" là trượt cả chục lần FAANG mới đỗ. Rồi đừng bỏ cuộc các thứ...

Nói chung là phải cày nhiều để trúng tủ, vậy nên tự tìm hiểu thì đến tám kiếp mới cày đủ để tăng xác xuất trúng tủ...
cũng hợp lý nhưng ngày 10 bài là quá nhiều,nghĩ 15 phút cũng tốn 150 fut rồi,còn đọc giải implement lại thì cũng fai 2 tiếng nữa là ít
Với nếu làm kiểu này sẽ có bài làm qua rồi nhưng sau gặp lại vẫn có thể quên
 
Không đồng tình với quan điểm tự tìm hiểu lắm.

Với cái leetcode này trừ khi làm vì sở thích và đam mê còn nếu làm để đi phỏng vấn thì cách cày là đọc cách giải liên tục mới cram được nhiều trong thời gian ngắn.
Theo quan điểm của tui cách cày leetcode là:
1. Mua premium membership của thằng leetcode hoặc algo expert
2. Ngày luyện tầm 10 câu trở lên (tính cả những câu đã làm rồi giờ làm lại).
3. Cho mỗi câu 15 phút suy nghĩ thôi. Nếu suy nghĩ không ra hướng thì đọc đáp án cho bằng hiểu (cái này có membership premium bọn nó sẽ giải thích dễ hiểu hơn từng bước). Sau đó implement lại đáp án mà không nhìn vào đáp án nữa.
4. Cứ lặp đi lặp lại như vậy cho đến khi nhớ được cách giải của càng nhiều bài càng tốt. Đến lúc phỏng vấn thì trúng tủ là đỗ không trúng tủ là trượt. (Mấy đứa giỏi hơn thì "hơi trúng tủ" bọn nó cũng đỗ vì nó đầu óc hơn nên biết biến đổi về dạng quen thuộc. Dạng này không nhiều và hầu hết là IOI với ACM rồi)

Theo quan điểm của tui thì đây là lý do khiến cho nhiều ông làm FAANG mà đi phỏng vấn không phải đỗ 90% trở lên được. Nhiều ông trên LinkedIn còn "khoe" là trượt cả chục lần FAANG mới đỗ. Rồi đừng bỏ cuộc các thứ...

Nói chung là phải cày nhiều để trúng tủ, vậy nên tự tìm hiểu thì đến tám kiếp mới cày đủ để tăng xác xuất trúng tủ...
đọc cách giải liên tục thì ko khác gì luyện gà cả, có tăng được tí nếp nhăn nào đâu
1BW9Wj4.png
theo toy cách giải 1 bài toán là 10 lần thử thất bại và 1 lần thành công, và rút được kinh nghiệm, hiểu thêm được các cách thất bại vì sao thất bại, học thêm được cái mới từ những lần thất bại đó. Chứ mới vô làm đúng đáp án luôn thì đã tự biết cách giải ròi, có học được thêm gì đâu
aVVa2xy.png


mấy bài medium/hard thì có thể cần lời giải thích, chứ mấy bài easy toy nghĩ cứ chém 1 line ko cần giải thích gì thêm. Ko có thời gian thì đừng đọc easy 1 line, còn đọc easy 1 line thì phải tự động não tìm hiểu vì sao. Easy mà còn ko chịu động não thì não động vào bài medium hay hard gì nổi
aVVa2xy.png


toy đứng trên quan điểm người làm chơi 1 ngày 1 bài thì dư thời gian mà tự tìm hiểu, còn cày 10 bài 1 ngày thì nặng đô lắm, có đọng lại được cái gì đâu. Nhớ thời toy cày 3-4 bài / ngày là mệt lắm ròi
g8XXj8u.gif
 
Sửa lần cuối:
Không đồng tình với quan điểm tự tìm hiểu lắm.

Với cái leetcode này trừ khi làm vì sở thích và đam mê còn nếu làm để đi phỏng vấn thì cách cày là đọc cách giải liên tục mới cram được nhiều trong thời gian ngắn.
Theo quan điểm của tui cách cày leetcode là:
1. Mua premium membership của thằng leetcode hoặc algo expert
2. Ngày luyện tầm 10 câu trở lên (tính cả những câu đã làm rồi giờ làm lại).
3. Cho mỗi câu 15 phút suy nghĩ thôi. Nếu suy nghĩ không ra hướng thì đọc đáp án cho bằng hiểu (cái này có membership premium bọn nó sẽ giải thích dễ hiểu hơn từng bước). Sau đó implement lại đáp án mà không nhìn vào đáp án nữa.
4. Cứ lặp đi lặp lại như vậy cho đến khi nhớ được cách giải của càng nhiều bài càng tốt. Đến lúc phỏng vấn thì trúng tủ là đỗ không trúng tủ là trượt. (Mấy đứa giỏi hơn thì "hơi trúng tủ" bọn nó cũng đỗ vì nó đầu óc hơn nên biết biến đổi về dạng quen thuộc. Dạng này không nhiều và hầu hết là IOI với ACM rồi)

Theo quan điểm của tui thì đây là lý do khiến cho nhiều ông làm FAANG mà đi phỏng vấn không phải đỗ 90% trở lên được. Nhiều ông trên LinkedIn còn "khoe" là trượt cả chục lần FAANG mới đỗ. Rồi đừng bỏ cuộc các thứ...

Nói chung là phải cày nhiều để trúng tủ, vậy nên tự tìm hiểu thì đến tám kiếp mới cày đủ để tăng xác xuất trúng tủ...

Ngày 10 câu thì 1 tuần là tẩu hỏa nhập ma rồi bác :D

1 ngày mà e phải làm >3 câu med trở lên là đã ko muốn nghĩ rồi. Nhất là hôm nào vừa có weekly contest + daily + 2->3 câu của study plan là quá tải đcđ
 
Ngày 10 câu thì 1 tuần là tẩu hỏa nhập ma rồi bác :D

1 ngày mà e phải làm >3 câu med trở lên là đã ko muốn nghĩ rồi. Nhất là hôm nào vừa có weekly contest + daily + 2->3 câu của study plan là quá tải đcđ
Ngày tui nhiều nhất 7,8 câu mới thôi nhưng hơn 10 câu cả cũ lẫn mới là được mà. Hơn 10 câu là tính cả những câu cũ đã làm rồi được randomly pick nên có thể làm lại đó. Mấy câu đó thì làm nhanh mà, ôn lại nên đọng được vào đầu chứ có phải 10 câu mới toanh đâu. À mà easy thì auto bỏ qua nhé, đừng làm làm gì tốn thời gian. Chỉ luyện medium với hard thôi.

Mà nói vậy nhé tui cũng phản đối cái trò luyện gà cày leetcode như thế này nhé. Nhưng đây là cuộc chơi với Big techs. Nó đã được quyết định như vậy rồi, mình phải làm vậy thôi nếu không sẽ không pass được big techs. Không muốn nhưng vẫn phải theo đóm ăn tàn thôi.
 
Làm nhiều làm ít tùy mục đích, mình làm dưỡng sinh thì cứ khó bỏ dễ ăn, rảnh thì nghĩ lâu chứ hôm nào bận thì dễ cũng chịu, cốt là vận động đầu óc cho đỡ ngu thôi. :D
 
Kỷ lục là 6 bài hard trong một buổi chiều, chọn sort theo popular. Nhưng đó phần lớn là bài từ thời đầu nên độ khó cũng chỉ hơn bài medium bây giờ chút xíu.
Còn mấy bài mới nếu gặp xui nghĩ sai hướng thì cả buổi cũng không xong 1 bài.

Sent from Xiaomi M2007J20CG using vozFApp
 
Follow up: Could you do it in O(n) time and O(1) space?

Chưa làm đc cái follow up này nên làm cách bình thường O(n) space
Python:
class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        arr = []
     
        while head:
            arr.append(head.val)
            head = head.next
     
        left = 0
        right = len(arr) - 1
     
        while left < right:
            if arr[left] != arr[right]:
                return False
            left += 1
            right -= 1
         
        return True

cho dãy
num = [1, 1, 1, '@', 1, 1, 1, *, 1, ^, &, ), 1, 1, g, j, w, 1]
dùng O(N) để ra các range của các số "1" trong dãy thì dùng thuật toán gì vậy các bác
res = [[0, 2], [4, 6], [8, 8], [12, 13], [16, 16]]

@_Gia_Cat_Luong_ , @Zayt__ bài này code kiểu gì nhanh vậy các bác
 
Follow up: Could you do it in O(n) time and O(1) space?

Chưa làm đc cái follow up này nên làm cách bình thường O(n) space
Python:
class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        arr = []
    
        while head:
            arr.append(head.val)
            head = head.next
    
        left = 0
        right = len(arr) - 1
    
        while left < right:
            if arr[left] != arr[right]:
                return False
            left += 1
            right -= 1
        
        return True



@_Gia_Cat_Luong_ , @Zayt__ bài này code kiểu gì nhanh vậy các bác

Bài daily thì không có gì để bàn rồi, làm O(1) space thì dùng slow / fast pointer, nói chung hơi tà đạo, không biết cũng không sao..

Còn bài dưới, sau bao phát biểu đầy não, đậm nếp nhăn thì thím có thể hỏi 1 câu như này được à ?

  • Lặp từ đầu tới cuối
  • Gặp số 1 mà trước đó không phải là số 1 thì đánh dấu lại
  • Gặp số khác 1 mà trước đó là số 1 thì lưu kết quả vào output
 
Bài daily thì không có gì để bàn rồi, làm O(1) space thì dùng slow / fast pointer, nói chung hơi tà đạo, không biết cũng không sao..

Còn bài dưới, sau bao phát biểu đầy não, đậm nếp nhăn thì thím có thể hỏi 1 câu như này được à ?

  • Lặp từ đầu tới cuối
  • Gặp số 1 mà trước đó không phải là số 1 thì đánh dấu lại
  • Gặp số khác 1 mà trước đó là số 1 thì lưu kết quả vào output
tks bác nha, để tui thử code xem sao, thao tác trên array, cái này giống hồi học C++ quá, khó mà :sad:
 
đọc code chúng nó làm slow/fast pointer làm gì nhỉ
JSxuR2w.gif
cứ duyệt hết đếm có bao nhiêu node, là giống như chạy fast pointer, rồi làm vòng for khác di chuyển qua n/2 node là ra, cũng y hệt như chạy slow pointer, tội gì code phức tạp vậy
aVVa2xy.png
 
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.212.708
Quay lại
Lên đầu trang