5 nhiệm vụ phỏng vấn JavaScript điển hình: phân tích và giải pháp

5 nhiệm vụ phỏng vấn JavaScript điển hình: phân tích và giải pháp

Từ người dịch: đã xuất bản một bài viết cho bạn Maria Antonietta Perna, người nói về các tác vụ JavaScript phổ biến, thường được cung cấp cho các ứng viên là nhà phát triển trong các cuộc phỏng vấn. Bài viết trước hết sẽ hữu ích cho những người mới lập trình.

Các cuộc phỏng vấn tại các công ty công nghệ từ lâu đã trở thành chủ đề bàn tán của thị trấn. Điều này không có gì đáng ngạc nhiên - việc vượt qua cuộc phỏng vấn thành công sẽ mang lại cho bạn cơ hội có được một công việc tốt. Nhưng điều này không đơn giản như vậy, vì những vấn đề phức tạp thường cần được giải quyết.

Hơn nữa, thông thường, hầu hết các nhiệm vụ này không liên quan đến công việc mà ứng viên sẽ thực hiện nhưng chúng vẫn cần được giải quyết. Đôi khi bạn phải làm điều đó trên bảng mà không cần kiểm tra với Google hoặc bất kỳ nguồn nào khác. Đúng vậy, tình hình đang dần thay đổi và một số công ty đang từ bỏ những cuộc phỏng vấn như vậy, nhưng nhiều nhà tuyển dụng vẫn tuân thủ truyền thống này. Bài viết này dành cho việc phân tích các tác vụ JavaScript điển hình thường được sử dụng làm nhiệm vụ cho người tìm việc.

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Hộp kỹ năng khuyến nghị: khóa học thực hành "Nhà phát triển di động PRO".

Điều chính là chuẩn bị kỹ lưỡng cho cuộc phỏng vấn của bạn.

Có, trước khi bắt đầu xem xét nhiệm vụ, chúng ta hãy xem một số mẹo chuẩn bị phỏng vấn chung.

Điều chính là chuẩn bị trước. Kiểm tra xem bạn nhớ các thuật toán và cấu trúc dữ liệu tốt như thế nào, đồng thời nâng cao kiến ​​thức của bạn trong các lĩnh vực mà bạn chưa quá quen thuộc. Có nhiều nền tảng trực tuyến có thể giúp bạn chuẩn bị cho cuộc phỏng vấn. Chúng tôi khuyên GeekforGeek, Chơi khăm, Phỏng vấn.io и MãTín hiệu.

Thật đáng để học cách nói to quyết định. Bạn nên nói với người nộp đơn về những gì bạn làm chứ không chỉ viết lên bảng (hoặc gõ mã vào máy tính, cũng như im lặng). Bằng cách này, nếu bạn mắc lỗi trong mã nhưng giải pháp nhìn chung là chính xác, bạn có thể tăng cơ hội thành công.

Bạn cần hiểu vấn đề trước khi bắt đầu giải quyết nó. Trong một số trường hợp, bạn có thể hiểu một nhiệm vụ một cách hời hợt và sau đó đi sai hướng. Có thể nên hỏi một số câu hỏi làm rõ cho người phỏng vấn.

Bạn cần luyện viết code bằng tay chứ không phải trên PC. Điều xảy ra là trong quá trình phỏng vấn, người nộp đơn sẽ được đưa cho một chiếc bút đánh dấu và một tấm bảng trắng, nơi không có gợi ý hoặc định dạng tự động. Khi tìm kiếm giải pháp, bạn nên viết mã của mình ra một tờ giấy hoặc trực tiếp lên bảng. Nếu bạn giữ mọi thứ trong đầu, bạn có thể quên điều gì đó quan trọng.

Tác vụ mẫu trong JavaScript

Một số nhiệm vụ này có thể đã quen thuộc với bạn. Bạn đã từng tham gia các cuộc phỏng vấn mà bạn phải giải quyết vấn đề tương tự hoặc thực hành chúng khi học JavaScript. Chà, bây giờ là lúc giải quyết chúng một lần nữa và kèm theo lời giải thích chi tiết về quy trình.

Xuôi ngược đều giống nhau

Một bảng màu là một từ, câu hoặc chuỗi ký tự được đọc giống hệt nhau cả theo hướng thông thường và theo hướng ngược lại. Ví dụ: “Anna” là một bảng màu nhưng “table” và “John” thì không.

Dàn dựng

Cho một chuỗi; bạn cần viết một hàm cho phép bạn trả về true nếu chuỗi đó là một bảng màu và sai nếu không. Trong trường hợp này, bạn cần tính đến dấu cách và dấu chấm câu.

palindrome('xe đua') === đúng
palindrome('bảng') === sai

Hãy phân tích nhiệm vụ

Ý tưởng chính ở đây là đảo ngược chuỗi. Nếu chuỗi “đảo ngược” hoàn toàn giống với chuỗi ban đầu thì chúng ta đã nhận được một bảng màu và hàm sẽ trả về true. Nếu không, sai.

phán quyết

Đây là đoạn mã giải quyết bảng màu.

const palindrome = str => {
  // turn the string to lowercase
  str = str.toLowerCase()
  // reverse input string and return the result of the
  // comparisong
  return str === str.split('').reverse().join('')
}

Bước đầu tiên là chuyển đổi các ký tự trong chuỗi đầu vào thành chữ thường. Đây là sự đảm bảo rằng chương trình sẽ tự so sánh các ký tự chứ không phải chữ hoa chữ thường hay bất kỳ thứ gì khác.

Bước thứ hai là đảo ngược dòng. Điều này không khó thực hiện: bạn cần chuyển đổi nó thành một mảng bằng phương thức .split() (Thư viện chuỗi). Sau đó, chúng ta đảo ngược mảng bằng cách sử dụng .reverse() (Thư viện mảng). Bước cuối cùng là chuyển đổi mảng đảo ngược thành chuỗi bằng cách sử dụng .join() (Thư viện mảng).

Bây giờ tất cả những gì bạn cần làm là so sánh chuỗi “đảo ngược” với chuỗi gốc, trả về kết quả đúng hoặc sai.

FizzBuzz

Một trong những nhiệm vụ phổ biến nhất trong các cuộc phỏng vấn.

Dàn dựng

Bạn cần viết hàm in các số từ 1 đến n ra console, trong đó n là số nguyên mà hàm lấy làm tham số, với điều kiện sau:

  • xuất ra fizz thay vì bội số của 3;
  • xuất buzz thay vì các số là bội số của 5;
  • đầu ra fizzbuzz thay vì các số là bội số của cả 3 và 5.

Ví dụ

Fizzbuzz(5)

Kết quả

// 1
// 2
// xì hơi
// 4
// buzz

Hãy phân tích nhiệm vụ

Điều chính ở đây là cách tìm bội số bằng JavaScript. Nó có thể được thực hiện bằng cách sử dụng toán tử mô đun hoặc phần dư - %, cho phép bạn hiển thị phần còn lại khi chia hai số. Nếu số dư bằng 0 thì số thứ nhất là bội số của số thứ hai.

12% 5 // 2 -> 12 không phải là bội số của 5
12% 3 // 0 -> 12 là bội số của 3

Vì vậy, nếu chia 12 cho 5, bạn được 2 với số dư là 2. Nếu bạn chia 12 cho 3, bạn được 4 với số dư là 0. Trong trường hợp đầu tiên, 12 không phải là bội số của 5, trong trường hợp thứ hai , 12 là bội số của 3.

phán quyết

Giải pháp tối ưu sẽ là đoạn mã sau:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // check if the number is a multiple of 3 and 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // check if the number is a multiple of 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // check if the number is a multiple of 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Hàm thực hiện các kiểm tra cần thiết bằng cách sử dụng các câu lệnh có điều kiện và tạo ra kết quả theo yêu cầu của người dùng. Trong bài toán, cần chú ý đến thứ tự của các câu lệnh if...else: bắt đầu bằng điều kiện kép (&&) và kết thúc bằng trường hợp không tìm được nhiều số. Kết quả là, chúng tôi bao gồm tất cả các tùy chọn.

Đảo chữ

Đây là tên của một từ chứa tất cả các chữ cái của một từ khác có cùng số nhưng theo thứ tự khác.

Dàn dựng

Chúng ta cần viết một hàm kiểm tra xem hai chuỗi có phải là đảo chữ hay không và trường hợp nào không quan trọng. Chỉ các ký tự được tính; dấu cách hoặc dấu chấm câu không được tính đến.

đảo chữ('finder', 'Friend') -> true
đảo chữ('xin chào', 'tạm biệt') -> sai

Hãy phân tích nhiệm vụ

Điều quan trọng cần cân nhắc ở đây là bạn cần kiểm tra từng chữ cái ở hai dòng đầu vào và số của chúng ở mỗi dòng.

công cụ tìm —> f: 1 người bạn —> f: 1
tôi: 1 r: 1
n: 1 tôi: 1
d: 1 e: 1
đ: 1 n: 1
r: 1 d: 1

Để lưu trữ dữ liệu đảo chữ, bạn nên chọn một cấu trúc chẳng hạn như đối tượng JavaScript. Chìa khóa trong trường hợp này là ký tự của chữ cái, giá trị là số lần lặp lại của nó trong dòng hiện tại.

Có những điều kiện khác:

  • Bạn cần đảm bảo rằng trường hợp chữ cái không được tính đến khi so sánh. Chúng tôi chỉ cần chuyển đổi cả hai chuỗi thành chữ thường hoặc chữ hoa.
  • Chúng tôi loại trừ tất cả các ký tự không phải ký tự khỏi so sánh. Tốt nhất nên làm việc với biểu thức chính quy.

phán quyết

// helper function that builds the
// object to store the data
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^w]/g).toLowerCase()) {
    // if the object has already a key value pair
    // equal to the value being looped over,
    // increase the value by 1, otherwise add
    // the letter being looped over as key and 1 as its value
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}
 
// main function
const anagram = (strA, strB) => {
  // build the object that holds strA data
  const aCharObject = buildCharObject(strA)
  // build the object that holds strB data
  const bCharObject = buildCharObject(strB)
 
  // compare number of keys in the two objects
  // (anagrams must have the same number of letters)
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // if both objects have the same number of keys
  // we can be sure that at least both strings
  // have the same number of characters
  // now we can compare the two objects to see if both
  // have the same letters in the same amount
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }
  // if both the above checks succeed,
  // you have an anagram: return true
  return true
}

Chú ý đến việc sử dụng Object.keys () trong đoạn trích trên. Phương thức này trả về một mảng chứa tên hoặc khóa theo cùng thứ tự xuất hiện trong đối tượng. Trong trường hợp này mảng sẽ như thế này:

['f', 'tôi', 'n', 'd', 'e', ​​'r']

Bằng cách này, chúng ta có được các thuộc tính của đối tượng mà không cần phải thực hiện một vòng lặp lớn. Trong một bài toán, bạn có thể sử dụng phương pháp này với thuộc tính .length để kiểm tra xem cả hai chuỗi có cùng số ký tự hay không - đây là một tính năng quan trọng của đảo chữ.

Tìm kiếm nguyên âm

Một nhiệm vụ khá đơn giản thường xuất hiện trong các cuộc phỏng vấn.

Dàn dựng

Bạn cần viết một hàm lấy một chuỗi làm đối số và trả về số nguyên âm có trong chuỗi đó.
Các nguyên âm là “a”, “e”, “i”, “o”, “u”.

Ví dụ:

findVowels('xin chào') // —> 2
findVowels('why') // —> 0

phán quyết

Đây là lựa chọn đơn giản nhất:

const findVowels = str => {
  let count = 0
  const vowels = ['a', 'e', 'i', 'o', 'u']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

Điều quan trọng là phải chú ý đến việc sử dụng phương thức .includes(). Nó có sẵn cho cả chuỗi và mảng. Nó nên được sử dụng để xác định xem một mảng có chứa một giá trị nhất định hay không. Phương thức này trả về true nếu mảng chứa giá trị đã chỉ định và trả về false nếu không.

Có một giải pháp ngắn hơn cho vấn đề:

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Điều này sử dụng phương thức .match(), cho phép bạn thực hiện tìm kiếm hiệu quả. Nếu tìm thấy một biểu thức chính quy làm đối số phương thức bên trong chuỗi đã chỉ định thì giá trị trả về là một mảng các ký tự khớp. Chà, nếu không có kết quả trùng khớp thì .match() trả về null.

Fibonacci

Một nhiệm vụ cổ điển có thể được tìm thấy trong các cuộc phỏng vấn ở nhiều cấp độ khác nhau. Cần nhớ lại rằng dãy Fibonacci là một chuỗi các số trong đó mỗi số tiếp theo là tổng của hai số trước đó. Vì vậy, mười số đầu tiên trông như thế này: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Dàn dựng

Bạn cần viết một hàm trả về bản ghi thứ n theo một trình tự nhất định, với n là số được truyền làm đối số cho hàm.

fibonacci(3) // —> 2

Nhiệm vụ này bao gồm việc đi qua một vòng lặp với số lần được chỉ định trong đối số, trả về giá trị ở vị trí thích hợp. Cách đặt vấn đề này đòi hỏi phải sử dụng các vòng lặp. Thay vào đó, nếu bạn sử dụng đệ quy, nó có thể làm hài lòng người phỏng vấn và cho bạn thêm một vài điểm.

phán quyết

const fibonacci = num => {
  // store the Fibonacci sequence you're going
  // to generate inside an array and
  // initialize the array with the first two
  // numbers of the sequence
  const result = [0, 1]
 
  for(let i = 2; i <= num; i++) {
    // push the sum of the two numbers
    // preceding the position of i in the result array
    // at the end of the result array
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // return the last value in the result array
  return result[num]
}

Trong mảng kết quả, hai số đầu tiên được chứa trong chuỗi vì mỗi mục trong chuỗi là tổng của hai số trước đó. Lúc đầu, không có hai số nào có thể được lấy để lấy số tiếp theo, vì vậy vòng lặp không thể tự động tạo ra chúng. Tuy nhiên, như chúng ta đã biết, hai số đầu tiên luôn là 0 và 1. Do đó, bạn có thể khởi tạo mảng kết quả theo cách thủ công.

Đối với đệ quy, mọi thứ đồng thời đơn giản hơn và phức tạp hơn:

const fibonacci = num => {
  // if num is either 0 or 1 return num
  if(num < 2) {
    return num
  }
  // recursion here
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Chúng ta tiếp tục gọi fibonacci(), chuyển các số ngày càng nhỏ hơn làm đối số. Chúng tôi dừng khi đối số được truyền là 0 hoặc 1.

Đầu ra

Rất có thể, bạn đã gặp phải bất kỳ nhiệm vụ nào trong số này nếu bạn đã được phỏng vấn cho vị trí nhà phát triển giao diện người dùng hoặc JavaScript (đặc biệt nếu đó là ở cấp cơ sở). Nhưng nếu bạn chưa gặp chúng, chúng có thể hữu ích trong tương lai - ít nhất là cho sự phát triển chung.

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Thêm một lời nhận xét