5 ぀の兞型的な JavaScript むンタビュヌ タスク: 分析ず解決策

5 ぀の兞型的な JavaScript むンタビュヌ タスク: 分析ず解決策

翻蚳者より: あなたのために蚘事を公開したした 䞀般的な JavaScript タスクに぀いお語る Maria Antonietta Perna 氏, ほずんどの堎合、面接䞭に開発者応募者に提案されたす。 この蚘事は、たず第䞀に、初心者プログラマヌにずっお圹立ちたす。

テクノロゞヌ䌁業の面接は長い間話題になっおきた。 これは驚くべきこずではありたせん。面接に合栌するず、良い仕事に就く機䌚が埗られたす。 しかし、倚くの堎合、耇雑な問題を解決する必芁があるため、これはそれほど単玔ではありたせん。

さらに、ほずんどの堎合、これらのタスクのほずんどは応募者が実行する䜜業ずは関連しおいたせんが、それでも解決する必芁がありたす。 堎合によっおは、Google やその他の情報源に確認せずに、ボヌド䞊でそれを実行しなければならない堎合がありたす。 はい、状況は埐々に倉化しおおり、䞀郚の䌁業はそのような面接を攟棄しおいたすが、倚くの雇甚䞻は䟝然ずしおこの䌝統を守っおいたす。 この蚘事では、求職者のタスクずしおよく䜿甚される兞型的な JavaScript タスクの分析に専念したす。

リマむンダヌ 「Habr」のすべおの読者が察象 - 「Habr」プロモヌション コヌドを䜿甚しおスキルボックス コヌスに登録するず 10 ルヌブルの割匕。

スキルボックスは次のこずを掚奚したす。 実践コヌス 「モバむルデベロッパヌPRO」.

重芁なのは、面接の準備をしっかりず行うこずです。

はい、タスクの説明を始める前に、面接準備の䞀般的なヒントをいく぀か芋おみたしょう。

䞻なこずは事前の準備です。 アルゎリズムずデヌタ構造をどれだけ芚えおいるかをテストし、あたり詳しくない分野の知識を向䞊させたす。 面接の準備に圹立぀オンラむン プラットフォヌムは数倚くありたす。 私たちはアドバむスしたす おたく, プランプ, むンタビュヌ.io О コヌド信号.

決定を声に出しお蚀うこずを孊ぶ䟡倀がありたす。 単に板曞するたたは黙っおコンピュヌタにコヌドを入力するだけでなく、自分が䜕をしおいるのかを応募者に䌝えるこずをお勧めしたす。 こうするこずで、コヌドに間違いがあっおも、解決策は通垞は正しい堎合に、成功の可胜性を高めるこずができたす。

問題を解決し始める前に、問題を理解する必芁がありたす。 堎合によっおは、タスクを衚面的に理解しおから、間違った道を進む可胜性がありたす。 面接官に明確な質問をいく぀かする䟡倀があるかもしれたせん。

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

最初のステップは、入力文字列内の文字を小文字に倉換するこずです。 これは、プログラムが倧文字小文字などを比范するのではなく、文字自䜓を比范するこずを保蚌したす。

XNUMX 番目のステップは、ラむンを反転するこずです。 これは難しいこずではありたせん。.split() メ゜ッド (String ラむブラリ) を䜿甚しお配列に倉換する必芁がありたす。 次に、.reverse() (配列ラむブラリ) を䜿甚しお配列を反転したす。 最埌のステップは、.join() (配列ラむブラリ) を䜿甚しお逆配列を文字列に倉換するこずです。

あずは、「逆」文字列を元の文字列ず比范しお、結果の true たたは false を返すだけです。

フィズバズ

面接で最も人気のあるタスクの XNUMX ぀。

ステヌゞング

次の条件で、1 から n たでの数倀をコン゜ヌルに出力する関数を䜜成する必芁がありたす。n は関数がパラメヌタヌずしお受け取る敎数です。

  • 3 の倍数の代わりに fizz を出力したす。
  • 5 の倍数の数倀の代わりにバズを出力したす。
  • fizzbuzz は、3 ず 5 の倍数の数倀の代わりに出力したす。

䟋

フィズバズ(5)

結果

/ / 1
/ / 2
// シュワシュワ
/ / 4
//バズ

タスクを分析したしょう

ここで重芁なのは、JavaScript を䜿甚しお倍数を芋぀ける方法です。 これは、剰䜙挔算子たたは剰䜙 - % を䜿甚しお実装できたす。これにより、0 ぀の数倀を陀算したずきに剰䜙を衚瀺できたす。 䜙りが XNUMX の堎合、最初の数倀が XNUMX 番目の数倀の倍数であるこずを意味したす。

12% 5 // 2 -> 12 は 5 の倍数ではありたせん
12% 3 // 0 -> 12 は 3 の倍数です

したがっお、12 を 5 で割るず 2 になり、䜙りは 2 になりたす。12 を 3 で割るず、4 になり、䜙りは 0 になりたす。最初のケヌスでは、12 は 5 の倍数ではありたせんが、12 番目のケヌスでは、3 は XNUMX の倍数ではありたせん。 , XNUMXはXNUMXの倍数です。

゜リュヌション

最適な解決策は次のコヌドになりたす。

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 ステヌトメントの順序に泚意する必芁がありたす。二重条件 (&&) で始たり、耇数の数倀が芋぀からなかった堎合で終わりたす。 その結果、すべおのオプションをカバヌしたす。

アナグラム

これは、別の単語のすべおの文字が同じ番号で、異なる順序で含たれおいる単語の名前です。

ステヌゞング

XNUMX ぀の文字列がアナグラムであるかどうかをチェックする関数を䜜成する必芁がありたす。倧文字ず小文字は関係ありたせん。 文字のみがカりントされたす。 スペヌスや句読点は考慮されたせん。

アナグラム('ファむンダヌ', '友達') —> true
アナグラム('こんにちは', 'さようなら') —> false

タスクを分析したしょう

ここで考慮すべき重芁なこずは、XNUMX ぀の入力行の各文字ず各行のそれらの番号を確認する必芁があるずいうこずです。

ファむンダヌ —> f: 1 フレンド —> f: 1
i:1 r:1
n:1 i: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('why') // —> 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、XNUMX、XNUMX。

ステヌゞング

特定の順序で 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 ぀の数倀が含たれたす。 最初は、次の数倀を取埗するために取埗できる XNUMX ぀の数倀は存圚しないため、ルヌプはそれらを自動的に生成できたせん。 ただし、ご存知のずおり、最初の XNUMX ぀の数倀は垞に XNUMX ず XNUMX です。したがっお、結果の配列を手動で初期化できたす。

再垰に関しおは、すべおがより単玔であるず同時により耇雑になりたす。

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 開発者の仕事の面接を受けたこずがある堎合 (特にそれがゞュニア レベルの堎合)、おそらく、これらのタスクのいずれかにすでに遭遇したこずがあるでしょう。 しかし、ただそれらに出䌚っおいない堎合でも、将来的には、少なくずも䞀般的な開発には圹立぀かもしれたせん。

スキルボックスは次のこずを掚奚したす。

出所 habr.com

コメントを远加したす