Những bài live coding kinh điển: đảo chuỗi, palindrome, FizzBuzz và lời giải gọn

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Dù đơn giản, những bài như đảo chuỗi, kiểm tra palindrome hay FizzBuzz vẫn được dùng để sàng lọc ở nhiều buổi phỏng vấn, đặc biệt với vị trí fresher và junior. Chúng cho người phỏng vấn thấy bạn viết code có cấu trúc, xử lý trường hợp biên và giải thích rõ ràng. Hãy luyện sáu bài sau, ví dụ bằng JavaScript.

1. FizzBuzz

Đề: in các số từ 1 đến n; số chia hết cho 3 in Fizz, chia hết cho 5 in Buzz, chia hết cho cả hai in FizzBuzz.

function fizzBuzz(n) {  const out = [];  for (let i = 1; i <= n; i++) {    if (i % 15 === 0) out.push('FizzBuzz');    else if (i % 3 === 0) out.push('Fizz');    else if (i % 5 === 0) out.push('Buzz');    else out.push(String(i));  }  return out;}

Điểm dễ sai: kiểm tra trường hợp chia hết cho cả 3 và 5 phải đặt trước các điều kiện riêng lẻ.

2. Đảo chuỗi

function reverseString(s) {  return s.split('').reverse().join('');}// Không dùng hàm có sẵnfunction reverseManual(s) {  let out = '';  for (let i = s.length - 1; i >= 0; i--) out += s[i];  return out;}

Hãy hỏi người phỏng vấn có được dùng hàm có sẵn hay không. Nếu chuỗi chứa ký tự Unicode đặc biệt như biểu tượng cảm xúc, việc tách theo từng đơn vị mã có thể sai; có thể nhắc điều này như một lưu ý nâng cao.

3. Kiểm tra palindrome

Đề: chuỗi đọc xuôi ngược giống nhau, bỏ qua dấu cách và chữ hoa thường.

function isPalindrome(s) {  const t = s.toLowerCase().replace(/[^a-z0-9]/g, '');  let i = 0, j = t.length - 1;  while (i < j) {    if (t[i] !== t[j]) return false;    i++; j--;  }  return true;}console.log(isPalindrome('A man, a plan, a canal: Panama')); // true

Dùng hai con trỏ từ hai đầu tiến vào giữa, độ phức tạp O(n) thời gian.

4. Đếm nguyên âm

function countVowels(s) {  const vowels = new Set(['a', 'e', 'i', 'o', 'u']);  let count = 0;  for (const ch of s.toLowerCase()) {    if (vowels.has(ch)) count++;  }  return count;}

Dùng Set để kiểm tra thành viên nhanh, đồng thời làm code dễ đọc hơn chuỗi điều kiện || dài.

5. Tìm số lớn thứ hai

function secondLargest(nums) {  let first = -Infinity, second = -Infinity;  for (const n of nums) {    if (n > first) { second = first; first = n; }    else if (n < first && n > second) { second = n; }  }  return second === -Infinity ? null : second;}

Lời giải duyệt một lần O(n) thay vì sắp xếp O(n log n). Xử lý số trùng bằng điều kiện n < first, và trả về null khi không tồn tại số lớn thứ hai.

6. Loại bỏ phần tử trùng

const unique = (arr) => [...new Set(arr)];console.log(unique([1, 2, 2, 3, 1])); // [1, 2, 3]

Hỏi thêm: nếu không được dùng Set, bạn có thể dùng một đối tượng hoặc Map để đánh dấu những giá trị đã gặp, vẫn giữ O(n).

Bí quyết trình bày

  • Nói trước ý tưởng, sau đó mới viết code.
  • Nêu trường hợp biên: chuỗi rỗng, một ký tự, ký tự đặc biệt, số âm.
  • Đặt tên hàm, biến rõ ràng; tách hàm nhỏ khi cần.
  • Cuối cùng nêu độ phức tạp thời gian và bộ nhớ.

Biến thể người phỏng vấn hay thêm vào

Sau khi bạn giải xong, họ thường hỏi thêm để xem bạn xử lý yêu cầu thay đổi thế nào. Với FizzBuzz, họ có thể thêm số 7 hoặc cho phép cấu hình luật bằng một danh sách, khi đó bạn nên tách luật ra thành mảng cặp (số chia, chữ in) và ghép chuỗi, thay vì thêm điều kiện if mới cho mỗi tổ hợp. Với palindrome, họ có thể hỏi "chuỗi con palindrome dài nhất", hướng giải là mở rộng từ tâm ra hai phía với độ phức tạp O(n²). Với loại bỏ phần tử trùng, họ có thể yêu cầu giữ nguyên thứ tự hoặc không dùng bộ nhớ phụ.

Điều quan trọng là bạn không hoảng hốt. Hãy nhắc lại yêu cầu mới, tìm phần code cần thay đổi và giữ cho phần còn lại nguyên vẹn. Đó chính là khả năng thích ứng mà công việc thật đòi hỏi mỗi ngày.

Viết kiểm thử nhanh ngay trong buổi phỏng vấn

Dù không bị yêu cầu, một vài dòng console.log hoặc assert kiểm tra kết quả mong đợi cho thấy bạn có thói quen kiểm thử. Ví dụ: console.assert(isPalindrome('') === true) để bắt trường hợp chuỗi rỗng. Thói quen nhỏ này tạo ấn tượng rất tốt.

Kết luận

Những bài này đơn giản nên người phỏng vấn thường chú ý đến cách bạn làm hơn là đáp án. Hãy luyện đến mức viết được chúng mà không phải suy nghĩ, rồi dành sức cho phần giải thích và biến thể mở rộng.

Nếu bạn muốn rèn nền tảng lập trình bằng bài tập thực hành, hãy tham khảo các khóa tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment