Làm coding challenge là cách tuyệt vời để cải thiện Ruby và kỹ năng giải quyết vấn đề. Và để chuẩn bị cho coding interview!
Tại sao?
Vì trong challenge bạn tập trung toàn bộ vào giải quyết 1 vấn đề cụ thể.
Bạn không phải lo lắng về bất cứ thứ gì khác.
Loại practice này mở rộng tư duy, cho phép bạn khám phá tính năng thú vị của ngôn ngữ và trở thành Ruby developer tốt hơn.
Một số challenge đòi hỏi kiến thức chuyên biệt về thuật toán, cấu trúc dữ liệu hoặc khái niệm, như một thủ thuật toán học nào đó.
Không sao nếu bạn không giải quyết được hầu hết.
Đừng lo!
Bây giờ:
Tôi nghĩ đọc một vài giải pháp sẽ giúp nắm được quy trình giải quyết challenge.
Bắt đầu với…
Challenge 1: Tìm phần tử trùng lặp
Challenge đầu tiên: cho mảng chứa giá trị Integer, tìm tất cả số bị trùng.
Ví dụ:
numbers = [1,2,2,3,4,5] find_duplicates(numbers) # [2]
Hãy bắt đầu bằng một câu hỏi…
"Làm sao biết một số cụ thể bị trùng?"
Tôi không tìm giải pháp một bước.
Ở giai đoạn này, tôi chỉ muốn hỏi và trả lời câu hỏi giúp tiến gần giải pháp.
Viết ra vài ý tưởng:
- Đếm số lần xuất hiện của mỗi số trong mảng, count = 2 nghĩa là trùng.
- Duyệt qua từng element và giữ danh sách "seen", nếu thấy element lần 2 thì tìm được duplicate.
- Gộp số thành string và dùng regex match số trùng.
Không quan trọng "cái nào tốt nhất" lúc này.
Đừng lo về đó!
Quan trọng bây giờ là có giải pháp chạy được. Chọn ý tưởng nghe hay và code nó.
Ví dụ:
seen = [] numbers.each_with_object([]) do |n, dups| dups << n if seen.include?(n) seen << n end # [2]
Có vẻ như giải pháp đúng.
Bây giờ:
Bạn muốn test với input khác (mảng khác) để chắc chắn nó chạy, viết unit test rất tốt cho việc này.
Nếu giải pháp 100% chạy thì thử giải pháp khác và dùng cái dễ hiểu hơn.
Đừng tìm sự hoàn hảo.
Hãy tìm học hỏi, hiểu bài và tiến bộ mỗi ngày!
Challenge 2: Từ hợp lệ
Cho mảng ký tự và một từ, kiểm tra từ có thể tạo từ các ký tự đó không.
Ví dụ:
word = "orange" characters = %w(e n g a r o) valid_word?(characters, word) # true
Lại bắt đầu bằng câu hỏi dẫn dắt tư duy.
"Làm sao chắc chắn từ có thể tạo từ các ký tự này?"
Nêu ra ý tưởng.
Bỏ phiền toái và suy nghĩ.
Có thể giúp nếu làm trên giấy.
Ý tưởng của tôi:
- Với mỗi ký tự trong
word, xóa ký tự đó khỏi mảngcharacters, nếu không xóa hết thì trả vềfalse - Đếm tất cả ký tự trong
wordvàcharacters, sau đó trừ count
Giải pháp khả thi:
word
.each_char
.all? { |ch| characters.delete_at(characters.index(ch)) rescue nil }
Giải pháp của bạn là gì?
Chia sẻ ở phần comment.
Tóm tắt
Bạn đã học về coding challenge và cách dùng chúng để cải thiện kỹ năng Ruby!
Nhớ:
Hoàn toàn ok nếu không giải quyết được challenge cụ thể. Hãy nghĩ như boss game, nếu boss level 100 mà bạn level 70 thì rất khó thắng.
Làm gì lúc đó?
Bạn level up và lấy kinh nghiệm với challenge dễ hơn (boss level thấp hơn), và trang bị tốt hơn (học thêm Ruby và lập trình).
Chúc may mắn và vui vẻ! 🙂