5個典型的JavaScript面試任務:分析與解決方案

5個典型的JavaScript面試任務:分析與解決方案

來自譯者: 為您發表了一篇文章 Maria Antonietta Perna,談論常見的 JavaScript 任務,最常在面試期間提供給開發人員申請人。 首先,本文對新手程式設計師很有用。

科技公司的面試長期以來一直是城裡的話題。 這並不奇怪——成功通過面試可以讓你有機會找到一份好工作。 但這並不那麼簡單,因為往往需要解決複雜的問題。

而且,大多數情況下,這些任務大多與申請人將要執行的工作無關,但仍需要解決。 有時您必須在板上完成此操作,而無需與 Google 或任何其他來源核實。 是的,情況正在逐漸改變,有些公司正在放棄這種面試,但許多雇主仍然堅持這項傳統。 本文致力於分析求職者經常使用的典型 JavaScript 任務。

提醒: 對於“Habr”的所有讀者 - 使用“Habr”促銷代碼註冊任何 Skillbox 課程可享受 10 盧布的折扣。

技能箱推薦: 實踐課程 “移動開發者專業版”.

最重要的是為面試做好充分的準備。

是的,在我們開始查看任務之前,讓我們先看看一些一般的面試準備技巧。

最主要的是提前做好準備。 測試你對演算法和資料結構的記憶程度,並提高你不太熟悉的領域的知識。 有許多線上平台可以幫助您準備面試。 我們建議 極客, 普拉普, 面試 и 代碼信號.

大聲說出決定是值得學習的。 建議告訴申請人您所做的事情,而不僅僅是在黑板上寫(或在電腦中輸入程式碼,也可以默默地)。 這樣,如果您在程式碼中犯了錯誤,但解決方案通常是正確的,您可以增加成功的機會。

在開始解決問題之前,您需要先了解問題。 在某些情況下,您可能會膚淺地理解一項任務,然後走上錯誤的道路。 也許值得向面試官提出​​一些澄清問題。

您需要練習手動編寫程式碼,而不是在 PC 上。 在面試過程中,申請人會得到一支記號筆和一塊白板,但沒有提示或自動格式化。 在尋找解決方案時,值得將程式碼寫在紙上或直接寫在黑板上。 如果你把一切都記在腦子裡,你可能會忘記一些重要的事情。

JavaScript 中的範本任務

您可能已經熟悉其中一些任務。 您要么參加過必須解決類似問題的面試,要么在學習 JavaScript 時進行過練習。 好吧,現在是時候再次解決它們,並詳細解釋該過程。

回文

回文是一個單字、句子或字元序列,在通常的方向和相反的方向上讀起來都完全相同。 例如,「Anna」是回文,但「table」和「John」不是。

分期

給定一個字串; 您需要編寫一個函數,如果字串是回文,則允許您傳回 true,如果不是,則傳回 false。 在這種情況下,您需要考慮空格和標點符號。

回文('賽車') === true
回文('表') === false

我們來分析一下任務

這裡的主要想法是反轉字串。 如果「反向」字串與原始字串完全相同,那麼我們收到了一個回文,並且該函數應該傳回 true。 如果不是,則為假。

解決方法

這是解決回文的程式碼。

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('')
}

第一步是將輸入字串中的字元轉換為小寫。 這是保證程式將比較字元本身,而不是大小寫或其他任何內容。

第二步是反轉線路。 這並不難做到:您需要使用 .split() 方法(字串庫)將其轉換為陣列。 然後我們使用 .reverse() (數組庫)反轉數組。 最後一步是使用 .join() (陣列庫)將反向陣列轉換為字串。

現在您需要做的就是將「反向」字串與原始字串進行比較,傳回結果 true 或 false。

菲茲巴茲

面試中最常見的任務之一。

分期

您需要編寫一個函數,將從 1 到 n 的數字列印到控制台,其中 n 是函數作為參數的整數,滿足以下條件:

  • 輸出嘶嘶聲而不是 3 的倍數;
  • 輸出嗡嗡聲而不是 5 的倍數的數字;
  • fizzbuzz 輸出而不是 3 和 5 的倍數的數字。

例子

嘶嘶聲(5)

導致

/ / 1
/ / 2
// 嘶嘶聲
/ / 4
//嗡嗡聲

我們來分析一下任務

這裡最主要的是一種使用 JavaScript 來找出倍數的方法。 它可以使用模運算子或餘數 - % 來實現,它允許您顯示兩個數字相除時的餘數。 如果餘數為 0,則表示第一個數是第二個數的倍數。

12% 5 // 2 -> 12 不是 5 的倍數
12% 3 // 0 -> 12 是 3 的倍數

因此,如果將12 除以5,則得到2,餘數為2。如果將12 除以3,則得到4,餘數為0。在第一種情況下,12 不是5 的倍數,在第二種情況下, 12 是 3 的倍數。

解決方法

最佳解決方案是以下程式碼:

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)
    }
  }
}

此函數使用條件語句執行必要的檢查並產生使用者所需的結果。 在這個問題中,值得注意的是 if...else 語句的順序:以雙條件 (&&) 開始,以找不到多個數字的情況結束。 因此,我們涵蓋了所有選項。

字謎

這是一個單字的名稱,其中包含另一個單字的所有字母,數字相同,但順序不同。

分期

我們需要編寫一個函數來檢查兩個字串是否是字謎詞,大小寫並不重要。 僅計算字元數; 不考慮空格或標點符號。

anagram('finder', 'Friend') —> true
anagram('你好', '再見') —> false

我們來分析一下任務

這裡要考慮的重要一點是,您需要檢查兩個輸入行中的每個字母及其在每行中的編號。

查找器 —> f: 1 朋友 —> f: 1
我: 1 r: 1
n:1 我:1
d:1 e:1
e:1 n:1
r:1 d:1

要儲存字謎數據,您應該選擇一種結構,例如 JavaScript 物件文字。 本例中的鍵是字母的字符,值是其在目前行中的重複次數。

還有其他條件:

  • 您需要確保比較時不考慮字母的大小寫。 我們只需將兩個字串轉換為小寫或大寫即可。
  • 我們從比較中排除所有非字元。 最好合作 常用表達.

解決方法

// 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
}

注意使用 Object.keys() 在上面的程式碼片段中。 此方法傳回一個數組,其中包含名稱或鍵,其順序與它們在物件中出現的順序相同。 在這種情況下,數組將如下所示:

[‘f’、‘i’、‘n’、‘d’、‘e’、‘r’]

這樣我們就可以獲得物件的屬性,而不必進行批次循環。 在出現問題時,您可以將此方法與 .length 屬性結合使用來檢查兩個字串是否具有相同數量的字元 - 這是字謎詞的一個重要功能。

搜尋元音

這是面試中常出現的相當簡單的任務。

分期

您需要編寫一個函數,該函數接受字串作為參數並傳回字串中包含的元音數量。
元音是「a」、「e」、「i」、「o」、「u」。

示例:

findVowels('hello') // —> 2
findVowels('為什麼') // —> 0

解決方法

這是最簡單的選擇:

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
}

請務必注意 .includes() 方法的使用。 它可用於字串和陣列。 它應該用於確定數組是否包含某個值。 如果陣列包含指定值,則此方法傳回 true,如果不包含指定值,則傳回 false。

該問題有一個更短的解決方案:

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

這使用 .match() 方法,它允許您實現高效的搜尋。 如果在指定字串中找到作為方法參數的正規表示式,則傳回值是符合字元的陣列。 那麼,如果沒有符合項,則 .match() 傳回 null。

斐波那契

這是一個在各個級別的面試中都可以找到的經典任務。 值得回顧的是,斐波那契數列是一系列數字,其中每個後續數字都是前兩個數字的總和。 因此,前十個數字如下:0、1、1、2、3、5、8、13、21、34。

分期

您需要編寫一個函數,以特定順序傳回第 n 個記錄,其中 n 是作為參數傳遞給函數的數字。

斐波那契(3) // —> 2

此任務涉及按照參數中指定的次數遍歷循環,並傳回適當位置的值。 這種提出問題的方式需要使用循環。 如果你改用遞歸,可能會讓面試官滿意,並給你加分。

解決方法

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]
}

在結果陣列中,前兩個數字包含在序列中,因為序列中的每個條目都是前兩個數字的總和。 一開始沒有兩個數字可以用來得到下一個數字,因此循環無法自動產生它們。 但是,正如我們所知,前兩個數字始終是 0 和 1。因此,您可以手動初始化結果陣列。

至於遞歸,一切都變得更簡單,同時也更複雜:

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)
}

我們不斷地呼叫 fibonacci(),並傳遞越來越小的數字作為參數。 當傳遞的參數為 0 或 1 時我們停止。

產量

如果您接受過前端或 JavaScript 開發人員工作的面試(尤其是初級程度),那麼您很可能已經遇到過這些任務​​中的任何一個。 但如果你還沒有遇到過它們,它們在未來可能會很有用——至少對於一般開發來說。

技能箱推薦:

來源: www.habr.com

添加評論