Hôm nay chúng ta sẽ cùng nhau tìm hiểu về 30 câu hỏi phỏng vấn Javascript. Trong phần 1 này, mình sẽ giới thiệu đến các bạn 10 câu hỏi đầu tiên trong loạt bài “Top 30 câu hỏi phỏng vấn Javascript thường gặp”.
Contents
- 1 I. Câu hỏi:
- 1.1 1. Viết function đảo ngược một chuỗi cho trước
- 1.2 2. Viết một function lọc số từ một mảng.
- 1.3 3. Viết function tìm kiếm phần tử trong một mảng
- 1.4 4. Viết function mô tả closure trong Javascript
- 1.5 5. Promise là gì, viết function trả về promise
- 1.6 6. Viết function aplanh hòn chuỗi cho trước
- 1.7 7. Viết function tìm kiếm phần tử trong một mảng – dùng thuật toán tìm kiếm nhị phân
- 1.8 8. Viết function nhận đầu vào là 2 số a, b và trả về thương số và số dư của phép chia a, b
- 1.9 9. Tính tổng các số fibonacci của một số N
- 1.10 10. Viết function nhận đầu vào là một chuỗi, trả về một “map” tần suất các kí tự xuất hiện trong chuỗi
- 2 II. Lời kết
I. Câu hỏi:
1. Viết function đảo ngược một chuỗi cho trước
Đây có thể gọi là câu hỏi huyền thoại, bất cứ coder nào cũng ít nhất đã từng nghe đến. Vậy thì trong Javascript chúng ta làm như thế nào?
Bạn đang xem: 30 Câu Phỏng Vấn Kỹ Thuật Với Javascript (Phần 1)
Javascript không có lớp String Builder như các ngôn ngữ khác (Java, C#,…), vì vậy chúng ta sẽ tạo một mảng mới, sau đó thêm các kí tự từ chuỗi gốc vào mảng đó và cuối cùng sử dụng phương thức Array.join để tạo thành chuỗi mới. Dưới đây là đoạn mã minh họa:
function reverseString(s) {
// Tạo một mảng rỗng để lưu kết quả
const result = [];
// Duyệt từ cuối chuỗi đến đầu chuỗi
for (let i = s.length-1; i >= 0; i -= 1) {
// Thêm kí tự hiện tại vào mảng
result.push(s[i]);
}
// Kết hợp các phần tử trong mảng để tạo thành chuỗi mới
return result.join('');
}
// Ví dụ sử dụng
console.log(reverseString(""));
console.log(reverseString("abc"));
console.log(reverseString("aaabbbcccd"));
2. Viết một function lọc số từ một mảng.
Với câu hỏi này, chúng ta cần lọc các phần tử trong mảng và loại bỏ những phần tử không phải là số. Nhưng làm thế nào để kiểm tra một phần tử có phải là số hay không? Trong trường hợp này, chúng ta có thể sử dụng toán tử typeof để kiểm tra kiểu dữ liệu của phần tử.
typeof 1 // "number"
Tuy nhiên, có một trường hợp đặc biệt khi giá trị là “1”, nếu sử dụng typeof thì kết quả sẽ là “string” như bên dưới:
typeof "1" // "string"
Vì vậy, để giải quyết trường hợp này, chúng ta có thể sử dụng hàm isNaN.
isNaN('') // false
isNaN(true) // false
Tuy nhiên, chúng ta cần kiểm tra xem phần tử có phải là boolean hay là một chuỗi rỗng hay không.
function isBoolean(value) {
return typeof value === 'boolean';
}
function isEmptyString(value) {
return typeof value === 'string' && value.trim().length === 0;
}
Dưới đây là một câu trả lời hoàn chỉnh:
function filterNumbers(arr) {
// Tạo một mảng rỗng để lưu kết quả
const result = arr.filter(function(value, i) {
// Lọc theo các quy tắc kiểm tra dữ liệu đầu vào là số
if (isNaN(value) || isBoolean(value) || isEmptyString(value)) {
return false;
}
return true;
});
// Trả về mảng chỉ chứa số
return result;
}
// Ví dụ sử dụng
console.log(filterNumbers([1, "2", " ", NaN, Number.POSITIVE_INFINITY, 66, "ab1", false]));
3. Viết function tìm kiếm phần tử trong một mảng
Đây là ví dụ điển hình của thuật toán “tìm kiếm tuyến tính”, được gọi là “Linear Search” trong tiếng Anh. Để giải quyết bài toán này, chúng ta cần duyệt qua tất cả các phần tử trong mảng để tìm ra phần tử cần tìm.
function linearSearch(arr, x) {
let lo = 0;
let hi = arr.length-1;
// Lặp từ đầu đến cuối mảng
while (lo <= hi) {
// Nếu tìm thấy phần tử thì trả về chỉ mục
if (arr[lo] === x) {
return lo;
} else {
lo += 1 // Tiếp tục tìm kiếm
}
}
// Trả về -1 để biểu thị không tìm thấy phần tử
return -1;
}
let arr = [1,3,5,7,9,11,14,18,22];
console.info("Phần tử được tìm thấy tại chỉ mục: " + linearSearch(arr, 22));
4. Viết function mô tả closure trong Javascript
Xem thêm : Tìm hiểu và học Python: Giáo trình Python PDF mới nhất (Cập nhật 2023)
Closure là khái niệm không còn xa lạ với các lập trình viên Javascript. Nếu bạn chưa biết về closure trong javascript là gì thì có thể tham khảo thêm ở đây.
Dưới đây là một ví dụ đơn giản về closure:
function multiplier(first) {
let a = first;
return function(b) {
return a * b;
};
}
let multiplyBy2 = multiplier(2);
console.info(multiplyBy2(4)); // 8
console.info(multiplyBy2(5)); // 10
Và sau ví dụ này, bạn cũng có thể giải thích closure là gì rồi đấy.
5. Promise là gì, viết function trả về promise
Để hiểu chi tiết hơn về Promise, bạn có thể xem thêm tại đây.
Dưới đây là một ví dụ cơ bản về Promise:
const resultPromise = function(idea) {
return new Promise(function(resolve, reject) {
if (idea.isGood) {
resolve(idea);
} else {
reject({ idea: idea, reason: "Not Realistic" });
}
});
};
resultPromise({idea: "Make Gold from Iron", isGood: false})
.then(function() {
console.info("Tôi giàu rồi!");
}, function(err) {
console.info("Bị từ chối vì: " + err.reason);
});
6. Viết function aplanh hòn chuỗi cho trước
Đây cũng là một câu hỏi phổ biến. Bạn có thể hiểu yêu cầu qua ví dụ sau:
Cho một mảng là: [1, [2,3, [4]]]
thì kết quả sẽ là mảng [1,2,3,4]
. Tức là mảng kết quả chỉ chứa các phần tử “một cấp”.
Để làm được điều này, quan trọng nhất là chúng ta phải xác định được mảng đó có bao nhiêu mảng con. Dưới đây là câu trả lời cho bài toán này:
function flatten(arr=[]) {
// Tạo một mảng mới để lưu kết quả
let result = [];
for (let item of arr) {
// Nếu phần tử là một mảng, chúng ta kết hợp nội dung của nó
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result = result.concat(item);
}
}
return result;
}
console.info(flatten([[1, 2, [3]], 4]));
7. Viết function tìm kiếm phần tử trong một mảng – dùng thuật toán tìm kiếm nhị phân
Cũng là bài toán tìm kiếm phần tử trong mảng, nhưng lần này chúng ta không dùng linear search nữa mà là dùng binary search. Dưới đây là phương pháp hiện thực cho thuật toán này:
function binarySearch(arr, x) {
let lo = 0;
let hi = arr.length-1;
while (lo <= hi) {
// Tìm vị trí phần tử ở giữa
let m = Math.floor((lo + hi) / 2);
// Kiểm tra nếu bằng với mục tiêu
if (arr[m] === x) {
return m;
// Giảm nửa mảng đang tìm kiếm
} else if (arr[m] < x) {
lo = m + 1;
} else {
hi = m - 1;
}
}
// Phần tử không được tìm thấy
return -1;
}
let arr = [1,3,5,7,9,11,14,18,22];
console.info("Phần tử được tìm thấy tại chỉ mục: " + binarySearch(arr, 22));
8. Viết function nhận đầu vào là 2 số a, b và trả về thương số và số dư của phép chia a, b
Xem thêm : Framework là gì? Tìm hiểu về các Framework
Với bài toán này, chúng ta cần trả về 2 kết quả:
- phép chia a / b
- phép chia a % b (số dư)
function divMod(a, b) {
// Kiểm tra chia cho 0
if (b !== 0 ) {
return [a / b, a % b];
}
return [0, 0];
}
console.info(divMod(16, 5));
console.info(divMod(20, 0));
9. Tính tổng các số fibonacci của một số N
Trong dãy Fibonacci, mỗi số là tổng của 2 số đứng trước nó.
Ví dụ: 0, 1, 1, 2, 3, 5, 8…
Chúng ta có thể giải bài toán này bằng cách sử dụng đệ quy hoặc vòng lặp while. Với đệ quy, chúng ta có thể thực hiện như sau:
function fib(n) {
if (n === 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
return fib(n-1) + fib(n-2);
}
}
console.info(fib(20));
Đoạn mã trên vẫn chưa phải là lời giải tối ưu nhất, và nếu được hỏi bởi người phỏng vấn, bạn có thể thay đổi như sau:
function memo(func) {
let cache = {};
return function (x) {
if (x in cache) return cache[x];
return cache[x] = func(x);
};
};
let fib = memo(function(n) {
if (n === 0) {
return 0;
} else if (n === 1) {
return 1;
} else {
return fib(n-1) + fib(n-2);
}
});
console.info(fib(20));
10. Viết function nhận đầu vào là một chuỗi, trả về một “map” tần suất các kí tự xuất hiện trong chuỗi
Để tính toán tần suất, chúng ta sẽ sử dụng bảng băm (hash table). Thông thường, để giải bài toán này, chúng ta có thể sử dụng đối tượng (object) với các key là các kí tự trong chuỗi và value là tần suất xuất hiện của kí tự đó. Hoặc có thể sử dụng Map của Javascript.
Dưới đây là đoạn mã giải bài toán này:
function computeFrequency(s) {
// Tạo bảng băm để lưu kết quả
const freqTable = new Map();
// Duyệt qua từng kí tự trong chuỗi
for (ch of s) {
// Kiểm tra xem chúng ta đã gặp kí tự này chưa
if (!freqTable.has(ch)) {
freqTable.set(ch, 1);
} else {
// Tăng giá trị tần suất lên
freqTable.set(ch, freqTable.get(ch) + 1);
}
}
// Trả về kết quả
return freqTable;
}
console.info(computeFrequency("abrakatabra"));
II. Lời kết
Vậy là chúng ta đã đi qua 10 câu hỏi trong series “30 câu hỏi phỏng vấn javascript”. Mong rằng qua series này, các bạn sẽ được trang bị kiến thức về Javascript để tự tin chinh phục mọi thử thách trong quá trình phỏng vấn. Hẹn gặp lại các bạn trong Phần 2.
Đừng quên đánh giá 5* cho bài viết nhé!
Nguồn: https://laptrinhc.edu.vn
Danh mục: Tài liệu IT