Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
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.
Đề: 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ẻ.
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.
Đề: 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')); // trueDùng hai con trỏ từ hai đầu tiến vào giữa, độ phức tạp O(n) thời gian.
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.
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.
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).
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.
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.
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.
Nguyễn Đình Cường
0 comment