目次
10. 順序付けされていない配列内の連続した数値かどうかを判断します
序文
フロントエンド開発の仕事ではHTML、CSS、JavaScriptなどの技術を習得することが重視されますが、アルゴリズムやデータ構造もフロントエンドエンジニアが身につけるべき基本的な能力の1つです。多くの企業の面接にはアルゴリズムも含まれます。今日は、アルゴリズムに関する最も一般的な質問のいくつかをまとめました。アルゴリズムを始めましょう!
トピック
1. 文字列を反転する
トピックの要件: 入力文字列を反転する関数を作成します。
例:
「Hello, World!」と入力します。
出力: "!dlroW ,olleH"
function reverseString(str) {
return str.split('').reverse().join('');
}
2.回文文字列を決定する
トピックの要件: 入力文字列が回文文字列 (順方向と逆方向の両方) であるかどうかを判断する関数を作成します。
例:
入力:「レベル」
出力: true
function isPalindrome(str) {
const reversed = str.split('').reverse().join('');
return str === reversed;
}
3. アレイの重複排除
トピックの要件: 入力配列内の重複要素を削除する関数を作成します。
例: 入力: [1、2、3、3、4、4、5]
出力: [1、2、3、4、5]
function removeDuplicates(arr) {
return Array.from(new Set(arr));
}
4. 最大値と最小値を見つける
トピックの要件: 入力配列の最大値と最小値を見つける関数を作成します。
例:
入力: [3、1、9、6、2、5]
出力: 最大値は 9、最小値は 1
function findMinMax(arr) {
const min = Math.min(...arr);
const max = Math.max(...arr);
return { min, max };
}
5. フィボナッチ数列
トピックの要件: 数値 n を入力し、フィボナッチ数列の n 番目の数値を返す関数を作成します。
例:
入力: 6
出力: 8 (フィボナッチ数列は 0、1、1、2、3、5、8、...)
function fibonacci(n) {
if (n <= 1) {
return n;
}
let a = 0;
let b = 1;
for (let i = 2; i <= n; i++) {
const temp = a + b;
a = b;
b = temp;
}
return b;
}
6. 欠落している番号を見つける
トピックの要件: 1 から n までの整数の順序なし配列が与えられ、そのうちの 1 つが欠落している場合、欠落している数値を見つける関数を作成してください。
例:
入力: [4、2、1、6、5]
出力: 3
function findMissingNumber(arr) {
const n = arr.length + 1;
const totalSum = (n * (n + 1)) / 2;
const actualSum = arr.reduce((sum, num) => sum + num, 0);
return totalSum - actualSum;
}
7. 2 つの文字列がアナグラムであるかどうかを判断する
トピックの要件: 2 つの文字列が与えられた場合、それらがアナグラム (同じ文字から並べ替えられたもの) であるかどうかを判断します。
例:
入力: 「聞いてください」、「静かにしてください」
出力: true
function isAnagram(str1, str2) {
const sortedStr1 = str1.split('').sort().join('');
const sortedStr2 = str2.split('').sort().join('');
return sortedStr1 === sortedStr2;
}
8. 配列の平坦化を実現する
トピックの要件: ネストされた多次元配列を 1 次元配列にフラット化する関数を作成します。配列フラット方式は使用できません。
例:
入力: [1、[2、[3、4]、5]、6]
出力: [1、2、3、4、5、6]
function flattenArray(arr) {
return arr.reduce((result, current) => {
if (Array.isArray(current)) {
result.push(...flattenArray(current));
} else {
result.push(current);
}
return result;
}, []);
}
9. 文字列圧縮を実装する
トピックの要件: 指定された文字列を圧縮する関数を作成して、同じ文字の連続出現数が 2 以上の場合に、その文字とその出現数を結合します。
例:
「aabbbbccdd」と入力します。
出力:「a2b4c2d2」
function compressString(str) {
let compressed = '';
let count = 1;
for (let i = 0; i < str.length; i++) {
if (str[i] === str[i + 1]) {
count++;
} else {
compressed += str[i] + count;
count = 1;
}
}
return compressed;
}
10. 順序付けされていない配列内の連続した数値かどうかを判断します
トピックの要件: 順序付けされていない整数配列が与えられた場合、配列内の要素が連続した数値シーケンスを形成できるかどうかを判断する関数を作成します。
例:
入力: [5、3、2、6、4]
出力: true (配列内の要素 2、3、4、5、6 は連続した数値シーケンスを形成できます)
function isConsecutive(arr) {
const sortedArr = arr.sort((a, b) => a - b);
for (let i = 1; i < sortedArr.length; i++) {
if (sortedArr[i] !== sortedArr[i - 1] + 1) {
return false;
}
}
return true;
}
要約する
アルゴリズムの質問は、面接官のプログラミング能力と問題解決能力を調べるだけでなく、面接官がコンピュータ サイエンスの基本原理を習得しているかどうかも反映します。したがって、フロントエンド面接の準備をする際には、アルゴリズムとデータ構造を学習する時間を合理的に確保し、アルゴリズムの質問を練習して能力を向上させると、面接の競争力がさらに高まります。