logo

Lộ trình

Khóa học

Tài liệu

Mock Interview

Liên hệ

Quay lại
  • Trang chủ

    /

  • Tài liệu

    /

  • Counting - Dạng bài phỏng vấn thuật toán phổ biến của các công ty
Tài liệu

Counting - Dạng bài phỏng vấn thuật toán phổ biến của các công ty

Ronin Engineer

14 Tháng 6 2025

<p>by @ToanBui</p><p>Các bài toán mang tư tưởng đếm xuất hiện phần lớn ở các bài phỏng vấn thuật toán của các công ty, các bài này thường ở mức dễ để xử lý.</p><p>Một mẫu đề bài ví dụ là cho một chuỗi kí tự và trả về kí tự có số lượng xuất hiện nhiều thứ 2 trong chuỗi.</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://roninhub.com/content/images/2025/06/io_counting-1.png" class="kg-image" alt="" loading="lazy" width="519" height="238"></figure><p>Để bắt đầu với điều này, hãy trở về quá khứ tại thời điểm bản thân bắt đầu học đếm. Phần lớn mọi người đều biết tới que tính với rất nhiều màu sắc (lục, đỏ, xanh, vàng,…). Mình có một chuỗi ví dụ đơn giản là “abacca”, mình sẽ lấy kí tự “a” với que tính đỏ, “b” là que tính vàng và “c” là que tính lục. Lúc này mình có số lượng que tính đỏ là 3, vàng là 1 và cuối cùng lục là 2. Việc còn lại là mình sẽ tìm lại số que có số lượng nhiều thứ 2 trong đó là lục tương đương với kí tự “c”.</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://roninhub.com/content/images/2025/06/example_counting.png" class="kg-image" alt="" loading="lazy" width="540" height="378"></figure><p>Trở lại với bài toán lập trình, hẳn mọi người nghĩ ngay tới việc tạo một hash table có các cặp key-value để xử lý bài toán với các key là một kí tự trong chuỗi, và value sẽ là số lần xuất hiện của các kí tự. Việc này hoàn toàn khả thi nhưng theo mình nghĩ không cần quá phức tạp như vậy.</p><p>Mình hoàn toàn có thể xử lý với một array gồm 26 vị trí tương đương với 26 kí tự trong bảng chữ cái. Sau đó, mình sẽ áp dụng mã của một kí tự theo bảng mã ASCII và trừ đi cho mã của kí tự đầu tiên trong bảng chữ cái là kí tự “a” với mã trên bảng mã ASCII là 97 lúc đó ta sẽ có COUNTING_ARR[97-97]++ (tăng lên khi kí tự xuất hiện trong chuỗi). Lúc này việc còn lại chỉ là tìm kí tự xuất hiện nhiều thứ hai.</p><figure class="kg-card kg-image-card"><img src="https://roninhub.com/content/images/2025/06/logic_flow_counting.png" class="kg-image" alt="" loading="lazy" width="1128" height="647" srcset="https://roninhub.com/content/images/size/w600/2025/06/logic_flow_counting.png 600w, https://roninhub.com/content/images/size/w1000/2025/06/logic_flow_counting.png 1000w, https://roninhub.com/content/images/2025/06/logic_flow_counting.png 1128w" sizes="(min-width: 720px) 720px"></figure><p>Với việc sử dụng array mình tin chắc mọi người sẽ ăn điểm với nhà tuyển dụng về việc xử lý array.</p><hr><p>✏️ System Design VN: <a href="https://fb.com/groups/systemdesign.vn%5C?ref=roninhub.com">https://fb.com/groups/systemdesign.vn</a><br>📚 Đọc thêm tài liệu khác: <a href="https://roninhub.com/tai-lieu%5C">https://roninhub.com/tai-lieu</a><br>🎬 Youtube: <a href="https://youtube.com/@ronin-engineer?ref=roninhub.com">https://youtube.com/@ronin-engineer</a></p>

by @ToanBui

Các bài toán mang tư tưởng đếm xuất hiện phần lớn ở các bài phỏng vấn thuật toán của các công ty, các bài này thường ở mức dễ để xử lý.

Một mẫu đề bài ví dụ là cho một chuỗi kí tự và trả về kí tự có số lượng xuất hiện nhiều thứ 2 trong chuỗi.

Để bắt đầu với điều này, hãy trở về quá khứ tại thời điểm bản thân bắt đầu học đếm. Phần lớn mọi người đều biết tới que tính với rất nhiều màu sắc (lục, đỏ, xanh, vàng,…). Mình có một chuỗi ví dụ đơn giản là “abacca”, mình sẽ lấy kí tự “a” với que tính đỏ, “b” là que tính vàng và “c” là que tính lục. Lúc này mình có số lượng que tính đỏ là 3, vàng là 1 và cuối cùng lục là 2. Việc còn lại là mình sẽ tìm lại số que có số lượng nhiều thứ 2 trong đó là lục tương đương với kí tự “c”.

Trở lại với bài toán lập trình, hẳn mọi người nghĩ ngay tới việc tạo một hash table có các cặp key-value để xử lý bài toán với các key là một kí tự trong chuỗi, và value sẽ là số lần xuất hiện của các kí tự. Việc này hoàn toàn khả thi nhưng theo mình nghĩ không cần quá phức tạp như vậy.

Mình hoàn toàn có thể xử lý với một array gồm 26 vị trí tương đương với 26 kí tự trong bảng chữ cái. Sau đó, mình sẽ áp dụng mã của một kí tự theo bảng mã ASCII và trừ đi cho mã của kí tự đầu tiên trong bảng chữ cái là kí tự “a” với mã trên bảng mã ASCII là 97 lúc đó ta sẽ có COUNTING_ARR[97-97]++ (tăng lên khi kí tự xuất hiện trong chuỗi). Lúc này việc còn lại chỉ là tìm kí tự xuất hiện nhiều thứ hai.

Với việc sử dụng array mình tin chắc mọi người sẽ ăn điểm với nhà tuyển dụng về việc xử lý array.


✏️ System Design VN: https://fb.com/groups/systemdesign.vn
📚 Đọc thêm tài liệu khác: https://roninhub.com/tai-lieu
🎬 Youtube: https://youtube.com/@ronin-engineer

beginner
dsa
buiductoan

Bài viết liên quan

Stack & Queue - Khi array không chỉ để lưu trữ

Stack & Queue là hai cấu trúc dữ liệu cơ bản và phổ biến trong con đường của một lập trình viên, hẳn rằng những lập trình viên có kinh nghiệm đều đã nghe, đã biết đến cấu trúc dữ liệu này, vậy cuối cùng thì, Stack & Queue là gì và nó có tác dụng thế nào? QUEUE - HÀNG ĐỢI Để bắt đầu nhẹ nhàng, chúng ta bắt đầu với Queue trước. Trước tiên thì Queue là một cấu trúc dữ liệu có dạng FIFO (First In Frist Out) tức là vào trước thì ra trước. Một ví dụ dễ thấy trong cuộc sống hàng ngày là việc xếp

CORS: Bản Chất, Hạn Chế và Best Practices

By Đức Hiếu Cross-Origin Resource Sharing (CORS) là một cơ chế bảo mật quan trọng trong phát triển web application hiện đại, cho phép kiểm soát việc truy cập tài nguyên giữa các domain khác nhau. 1. Vấn đề mà CORS  giải quyết 1.1. Thời kỳ đầu Web: không có Same-Origin Policy (SOP) Trong những ngày đầu của World Wide Web, các trình duyệt không có bất kỳ hạn chế nào về việc truy cập tài nguyên giữa các domain khác nhau. JavaScript code từ một trang web có thể: * Gửi requests đến mọi server

ACID - A Deep Dive into Transactions

By @wuan580 Trong thế giới khắc nghiệt của các hệ thống dữ liệu, mọi thứ đều có thể xảy ra: * Phần mềm hoặc phần cứng cơ sở dữ liệu có thể bị lỗi bất cứ lúc nào (kể cả giữa thao tác ghi) * Ứng dụng có thể sập giữa chừng, khi một loạt thao tác vẫn chưa hoàn tất. * Sự cố mạng có thể bất ngờ cắt đứt ứng dụng khỏi cơ sở dữ liệu hoặc một nút cơ sở dữ liệu này khỏi nút khác. * Nhiều client có thể ghi đồng thời, vô tình ghi đè lên thay đổi của nhau. * Client có thể đọc dữ liệu vô nghĩa vì nó chỉ

Áp dụng Connection Multiplexing trong ProxySQL để tối ưu kết nối Database

By Đức Hiếu 1. Tổng quan Connection Multiplexing là một trong những tính năng nổi bật nhất của ProxySQL, giúp giải quyết vấn đề bottleneck về kết nối với hệ thống Database. Khác với connection pooling truyền thống, multiplexing cho phép nhiều frontend connections chia sẻ các backend connections thông qua tỷ lệ N:M thay vì 1:1, từ đó giảm đáng kể áp lực lên Database layer. 2. Vấn đề với mô hình Thread-per-Connection của MySQL Trong mô hình truyền thống, MySQL sử dụng thread-per-connection m

Java Virtual Thread: Cuộc cách mạng cho lập trình đồng thời

By @wuan.580 Bạn đã bao giờ viết một ứng dụng xử lý hàng ngàn request cùng lúc, và cảm thấy như mình đang chiến đấu với chính Java? Bạn từng dùng ThreadPoolExecutor và vắt óc cân chỉnh số lượng thread cho "vừa đủ dùng", tránh thiếu nhưng cũng không dám dư vì sợ OutOfMemoryError? Bạn từng nhăn mặt khi phải viết những dòng code callback chằng chịt, chỉ để tránh block một luồng? Và rồi đau đầu gỡ bug vì stacktrace rối như tơ vò? Nếu câu trả lời là "có", thì bạn không đơn độc. Và bạn cũng sắp có

Tất cả bài viết
logo

HỘ KINH DOANH LẬP VƯƠNG

Giấy chứng nhận đăng ký doanh nghiệp số: 8656162915-001. Cấp ngày 21/02/2024. Nơi cấp: Sở Kế hoạch và Đầu tư TP. Hà Nội

PHƯƠNG THỨC THANH TOÁN

vnpay

LIÊN HỆ

roninengineer88@gmail.com

0362228388

26 ngõ 156 Hồng Mai, Hai Bà Trưng, Hà Nội

THEO DÕI CHÚNG TÔI

Facebook

Youtube

Tiktok

CHÍNH SÁCH

Chính sách bảo mật

Chính sách thanh toán

Đổi trả/Hoàn tiền

Hướng dẫn thanh toán VNPAY

PHƯƠNG THỨC THANH TOÁN

vnpay

Ronin Engineer 2024