アレイのインタビューに関する質問と回答トップ 50 (2026)
Arrayの面接の準備はできていますか?どんな質問が来るか、今こそ集中して考えるべき時です。{{keyword}}を理解することで、応募者は分析的思考力、論理的思考力、そして問題解決能力を効果的に発揮できるようになります。
配列はプログラマーの技術経験と専門経験の基盤となります。新卒者からベテランまで、配列を習得することは、強力な技術的専門知識とデータ操作における基礎的な経験を示すことになります。雇用主は質疑応答セッションなどでこのようなスキルを高く評価します。ping 候補者は、自信に満ちた分析力と実践的なスキルセットで、一般試験、上級試験、口頭試問を突破します。
このコレクションは、85 名を超える技術リーダー、マネージャー、専門家からの洞察に基づいて、さまざまな業界の多様な視点をカバーしており、各トピックが本物の採用期待と現実世界のコーディング評価基準を反映していることを保証します。

アレイの面接でよくある質問と回答
1) 配列とは何か、他のデータ構造とどう違うのかを説明します。
配列は、同じデータ型の複数の要素を格納する連続したメモリブロックです。インデックスを使用して任意の要素に定数時間でアクセスできるため、ランダムアクセスにおいて最も効率的な構造の一つです。連結リストとは異なり、配列は固定サイズで、ポインタを格納するためのオーバーヘッドがありません。要素数が事前にわかっている場合は配列が適しており、頻繁にサイズが変更されることが予想される場合はリストやベクターなどの動的な構造が使用されます。
| 機能 | 配列 | リンクリスト |
|---|---|---|
| メモリ割り当て | 隣接する | 非連続 |
| アクセス時間 | O(1) | O(N) |
| 挿入/削除 | 高価 | 効率的な |
| メモリのオーバーヘッド | ロー | 高(ポインタ) |
2) 配列にはどのような種類がありますか?例を挙げてください。
配列は、その次元と用途に基づいて分類されます。主な種類は次のとおりです。
- 一次元配列: 要素を線形に格納します。例:
int arr[5] = {1,2,3,4,5}. - 2次元配列: 行列などの表形式のデータを表します。
- 多次元配列: 高次元。シミュレーションや画像処理でよく使用されます。
- 動的配列: 要素が追加されたときに自動的にサイズを変更します。例:
ArrayListin Java,vectorin C++.
| タイプ | Structure | 例: |
|---|---|---|
| 1D | 線形 | [1, 2, 3] |
| 2D | マトリックス | [[1, 2], [3, 4]] |
| ダイナミック | サイズ変更可能な | std::vector<int> |
3) 配列内の最大要素と最小要素を見つけるにはどうすればよいでしょうか?
この問題は、多くの場合、線形探索を用いて解決されます。最小値と最大値の2つの変数を保持し、反復処理中に更新します。
アルゴリズム:
- 初期化します
min(NAIST) とmax最初の要素と。 - 配列を走査し、各要素を比較します。
- 更新
minormaxそれに応じて。
例 (C++):
int arr[] = {5, 2, 9, 1, 7};
int min = arr[0], max = arr[0];
for (int i : arr) {
if (i < min) min = i;
if (i > max) max = i;
}
時間計算量: の上)。
4) 配列の利点と欠点は何ですか?
配列はランダム アクセスに対して高いパフォーマンスを提供しますが、サイズが固定されており、サイズ変更にはコストがかかります。
| 側面 | 優位性 | デメリット |
|---|---|---|
| パフォーマンス | 高速インデックス(O(1)) | 挿入/削除が遅い (O(n)) |
| メモリ | コンパクトな収納 | 静的サイズ割り当て |
| 製品の導入 | 単純な構文 | 一部の言語では境界チェックが行われない |
| Use Case | 固定データセットに適している | 頻繁な変更には非効率的 |
5) 静的配列と動的配列の違いを説明してください。
A 静的配列 コンパイル時に決定される固定サイズを持ちますが、 動的配列 実行時に拡大または縮小できます。静的配列はメモリ効率は良いものの、柔軟性に欠けます。一方、動的配列は、サイズ変更時に若干のオーバーヘッドが発生しますが、柔軟性を提供します。
| 機能 | 静的配列 | ダイナミックアレイ |
|---|---|---|
| サイズ | 一定 | 変数 |
| メモリ | スタック | ヒープ |
| 例: | int arr[5]; |
std::vector<int> |
| サイズ変更 | サポートされていません | サポート |
ユースケース例:
組み込みシステムでは静的配列を使用し、サイズが予測できないコレクションには動的配列を使用します。
6) 配列をインプレースで反転するにはどうすればよいでしょうか?
Rev配列をインプレースで交換するには、スワップ処理が必要です。ping 両端から要素が中心に向かって移動する。
アルゴリズム:
- 2 つのポインタを初期化します。
start = 0(NAIST) とend = n - 1. - 要素の交換
arr[start](NAIST) とarr[end]. - インクリメント
startおよび減少end彼らが出会うまで。
例 (Python):
arr = [1, 2, 3, 4, 5] arr.reverse() # Built-in method # or manually arr = arr[::-1]
時間計算量: の上)、 スペースの複雑さ: O(1)。
7) ギザギザ配列と多次元配列の違いは何ですか?
A ギザギザの配列 は配列の配列であり、内部の配列の長さは異なっていてもかまいませんが、 多次元配列 行と列のサイズが均一です。
| 機能 | ギザギザ配列 | 多次元配列 |
|---|---|---|
| Structure | 不規則(ネストされた配列) | 長方形(マトリックス) |
| メモリ | 非連続 | 隣接する |
| アクセス | arr[i][j] |
arr[i][j] |
| 例: | int[][] jagged = {{1,2}, {3,4,5}}; |
int[,] matrix = {{1,2}, {3,4}}; |
データが不均一な場合、ジャグ配列の方がメモリ効率が高くなります。
8) 1 から n までの配列で欠けている数字を見つけるにはどうすればよいでしょうか?
この問題は自然数の数学的性質を活用します。
アプローチ1(合計式):
最初の合計 n 自然数 = n*(n+1)/2.
サブtracこの合計から配列要素の合計を求めます。
アプローチ2(XOR):
1からnまでの数字を持つすべての要素のXOR演算を行います。残りの値が不足している数字になります。
例:
『Brooklyn Galaxy』のために、倪氏はブルックリン美術館のコレクションからXNUMX点の名品を選び、そのイメージを極めて詳細に描き込みました。これらの作品は、彼の作品とともに中国ギャラリーに展示されています。彼はXNUMX年にこの作品の制作を開始しましたが、最初の硬貨には、当館が所蔵する [1,2,4,5,6] (n=6):
予想合計 = 21、実際の合計 = 18 → 不足 = 3。
時間計算量: の上)、 スペースの複雑さ: O(1)。
9) 配列から重複を削除するにはどのような方法がありますか?
言語と制約に応じていくつかのアプローチがあります。
- HashSet の使用: 一意の要素のみを保存します。
- ソートの使用: 配列をソートし、隣接する重複を削除します。
- 頻度マップの使用: Track個の各要素の数。
例 (Java):
Set<Integer> unique = new HashSet<>(Arrays.asList(arr));
| アプローチ | 時間 | 宇宙 |
|---|---|---|
| ハッシュセット | O(N) | O(N) |
| 選別 | O(n log n) | O(1) |
| 周波数 | O(N) | O(N) |
10) 配列内で 2 番目に大きい要素を見つけるにはどうすればよいでしょうか?
2 つの変数を維持することで、1 回のトラバーサルで 2 番目に大きい要素を見つけることができます。
アルゴリズム:
- 初期化します
first(NAIST) とsecondasINT_MIN. - 配列を走査します。
- より大きな値が見つかった場合は両方を更新します。
例 (C++):
int first = INT_MIN, second = INT_MIN;
for (int x : arr) {
if (x > first) {
second = first;
first = x;
} else if (x > second && x < first) {
second = x;
}
}
時間計算量: の上)、 スペースの複雑さ: O(1)。
11) 配列を「k」位置だけ回転させるにはどうすればよいでしょうか? 様々なアプローチを説明してください。
配列の回転は要素を周期的にシフトします。 3つの主な方法 それを達成するために:
- 一時配列の使用: 最初の k 要素をコピーし、他の要素をシフトした後、最後に追加します。
- 使い方 Reversalアルゴリズム: Reverse 配列は3つの部分に分けられます。最初の部分、2番目の部分、そして配列全体です。
- ジャグリングアルゴリズムの使用: n と k の GCD に基づきます (O(n) で効率的)。
例(2 右回転):
Input: [1,2,3,4,5] Output: [4,5,1,2,3]
| 方法 | 時間 | 宇宙 | 詳細説明 |
|---|---|---|---|
| 一時配列 | O(N) | わかりました) | シンプルで直感的 |
| Revエルサル | O(N) | O(1) | インプレースで効率的 |
| ジャグリング | O(N) | O(1) | GCDサイクルに基づく |
12) サブ配列とは何ですか? サブシーケンスとどう違うのですか?
A サブ配列 は配列の連続した部分であり、 部分列 順序は維持されますが、要素がスキップされる可能性があります。
| プロパティ | サブアレイ | 部分列 |
|---|---|---|
| 隣接する | はい | いいえ |
| 秩序の維持 | はい | はい |
| 例([1,2,3]より) | [1,2]、[2,3] | [1,3]、[2,3] |
例:
与えられた配列 [1,2,3]、合計サブ配列数 = n*(n+1)/2 = 6.
一方、部分列は 2ⁿ - 1 = 7 空でない組み合わせ。
13) 最大合計サブ配列をどのように見つけますか?
その カダネのアルゴリズム 最大の合計を持つ連続した部分配列を見つける最も効率的な方法です。
ステップ:
- 初期化します
max_current = max_global = arr[0]. - 要素を反復処理します。
- 更新
max_current = max(arr[i], arr[i] + max_current). - Trackはグローバル最大値である。
例:
入力: [-2,1,-3,4,-1,2,1,-5,4] → 出力: 6 (サブ配列 [4,-1,2,1]).
複雑:
O(n) 時間、O(1) 空間。
14) 余分なスペースを使用せずに 2 つのソートされた配列を結合するにはどうすればよいですか?
2つのソートされた配列を結合する 所定の位置に両方の配列の最後から比較するという考え方です。
アプローチ:
- 両方の配列の最後の有効な要素から開始します。
- 比較して、大きい方を結合されたスペースの端に移動します。
- すべての要素が結合されるまで繰り返します。
例 (C++):
int i = m-1, j = n-1, k = m+n-1;
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) A[k--] = A[i--];
else A[k--] = B[j--];
}
時間計算量: O(m+n)。
15) 配列内の要素を検索するにはどのような方法がありますか?
| 方法 | タイプ | 時間の複雑さ | 使用例 |
|---|---|---|---|
| 線形検索 | 未分類 | O(N) | 一般検索 |
| バイナリ検索 | 並べ替え | O(log n) | 効率的な検索 |
| ハッシング | 順序なし | O(1)平均 | 大規模なデータセット |
例(二分探索 – Python):
def binary_search(arr, x):
l, r = 0, len(arr)-1
while l <= r:
mid = (l+r)//2
if arr[mid] == x: return mid
elif arr[mid] < x: l = mid+1
else: r = mid-1
return -1
16) 配列の浅いコピーと深いコピーの違いを説明してください。
A 浅いコピー 元の要素への参照をコピーしますが、 ディープコピー すべてのデータを新しいメモリ位置に複製します。
| コピータイプ | データの独立性 | 例: |
|---|---|---|
| 浅い | いいえ | arr_copy = arr |
| 深い | はい | arr_copy = arr[:] (Python) |
例:
浅いコピーを変更すると元の配列に反映されますが、深いコピーでは反映されません。
17) 余分なスペースを使用せずに配列内の重複を見つけるにはどうすればよいですか?
アプローチ1(ソート): 隣接する要素を並べ替えてチェックします。
アプローチ2(1~nの値の否定法) 訪問したインデックスを、そのインデックスの要素を否定することでマークします。
アプローチ3(フロイドサイクルの検出) 配列をリンクリストとして扱い、サイクルを検索します(範囲 [1..n] 内の繰り返し要素の場合)。
例:
配列 [3,1,3,4,2] → 複製 = 3.
時間: の上)、 スペース: O(1)。
18) スパース配列とその利点とは何ですか?
A 疎な配列 ほとんどがゼロまたはデフォルト値です。すべての要素を格納する代わりに、ゼロ以外のエントリとそのインデックスのみを格納します。
Advantages:
- メモリを節約します。
- マトリックスやドキュメント用語の頻度などの大規模なデータセットに効率的です。
| タイプ | 例: | Use Case |
|---|---|---|
| 密な配列 | [0,1,0,2,3] |
小さなデータ |
| スパース配列 | {1:1, 3:2, 4:3} |
大規模なスパースデータ |
例: 機械学習モデル(TF-IDF マトリックス)で使用されます。
19) 2 つの配列の交差を効率的に見つけるにはどうすればよいでしょうか?
交差はハッシュまたはソート技術を使用して見つけることができます。
- HashSet の使用: 最初の配列の要素を追加し、次に 2 番目の配列のメンバーシップを確認します。
- 2つのポインタの使用: ソートされた配列に対して機能します。
例 (Python):
intersection = list(set(arr1) & set(arr2))
複雑:
- ハッシュセット: O(n)
- 2 つのポインタ: ソートのため O(n log n) です。
20) 配列における行優先と列優先の違いを説明してください。
これらは多次元配列に使用されるメモリ保存順序です。
| 概念 | 行メジャー(C/C++) | 列優先(Fortran、MATLAB) |
|---|---|---|
| 保管順序 | 行ごとに | 列ごとに |
| 住所式 | Base + ((i * cols) + j) * size |
Base + ((j * rows) + i) * size |
| 利点 | 行の走査が高速化 | 列のトラバーサルが高速化 |
例:
2次元配列の場合 A[2][3]、行主要店舗 [A[0][0], A[0][1], A[0][2], A[1][0], ...].
21) プレフィックス合計テクニックとは何ですか? また、配列ではどのように使用されますか?
その 接頭辞合計 この手法では、範囲クエリに効率的に応答するために、配列の累積合計を事前に計算します。
コンセプト:
prefix[i] = prefix[i-1] + arr[i]
次に、l から r までの要素の合計を取得するには、次を使用します。
sum(l, r) = prefix[r] - prefix[l-1]
例:
配列 = [2, 3, 5, 7, 1]
プレフィックス = [2, 5, 10, 17, 18]
合計(2,4) = prefix[4] - prefix[1] = 15
用途:
サブ配列の合計クエリ、累積頻度表、競争プログラミングで使用されます。
複雑:
前処理: O(n)、クエリ: O(1)
22) スライディング ウィンドウ技術によってアレイのパフォーマンスはどのように向上するのでしょうか?
その スライドウィンドウ この手法は、連続したセグメント (サブ配列) を含む問題を効率的に解決するために使用されます。
アイディア: すべてのウィンドウの合計または条件を再計算する代わりに、次の要素を追加して最初の要素を削除することで結果を更新します。
問題例:
サイズの最大合計部分配列を見つける k.
アルゴリズム:
- 最初の合計を計算する
k要素。 - ウィンドウを 1 つの要素ずつスライドします。
- 新しい要素を追加し、最初の要素を削除し、 trackは最大値です。
時間計算量: O(n) — 単純な O(n×k) アプローチよりもはるかに高速です。
用途:
最大平均サブ配列、最長サブ文字列、または各ウィンドウの最初の負の数などの問題で使用されます。
23) C言語における配列とポインタの違いは何ですか?
| 機能 | 配列 | ポインタ |
|---|---|---|
| 類似データ要素の収集 | メモリアドレスを格納する変数 | |
| メモリ割り当て | 隣接する | 動的または任意 |
| サイズ | 一定 | サイズを変更可能 |
| 例: | int a[5]; |
int *p; |
主な違い:
配列名は定数ポインターとして機能しますが、ポインターは動的に任意の場所を指すことができます。
例:
int arr[3] = {1,2,3};
int *ptr = arr; // ptr points to first element
24) 配列内の平衡インデックスを見つけるにはどうすればよいでしょうか?
An 均衡指数 左側の要素の合計が右側の要素の合計と等しくなる位置です。
アルゴリズム:
- 配列の合計を計算します。
- 横断して左の合計を維持します。
- If
(total_sum - left_sum - arr[i]) == left_sum、インデックスを返します。
例:
アレイ: [1, 3, 5, 2, 2] → インデックス = 2 (左の合計 = 右の合計 = 4 なので)
複雑: の上)、 スペース: O(1)
25) スパース行列とは何ですか? また、どのように効率的に保存しますか?
A スパース行列 ほとんどがゼロです。メモリを節約するため、ゼロ以外の要素とそのインデックスのみが格納されます。
保管方法:
- 座標リスト(COO): (行、列、値) を保存します。
- 圧縮スパース行 (CSR): 3 つの配列:
values,col_index,row_pointer. - キー辞書(DOK): (行、列) → 値のハッシュ マップ。
| 方法 | メモリ効率 | 使用例 |
|---|---|---|
| 最高執行責任者 | 穏健派 | 一般的な保管 |
| 社会貢献活動 | ハイ | 数値計算 |
| DOK | 様々な | 動的挿入 |
広く使用されている 機械学習 (TF-IDF、グラフ隣接行列)。
26) 偶数と奇数が交互になるように配列を並べ替えるにはどうすればよいでしょうか?
目標は、偶数と奇数の相対的な順序を維持しながら、それらを交互に配置することです。
アルゴリズム:
- 偶数配列と奇数配列を分けます。
- 偶数または奇数から交互に結合します。
- 1 種類が足りなくなったら、残りを追加します。
例:
Input: [3, 6, 12, 1, 5, 8] Output: [6, 3, 12, 1, 8, 5]
複雑: O(N)
27) 配列の回転と配列のシフトの違いを説明してください。
| Opera生産 | 回転 | Shiftる |
|---|---|---|
| 要素は循環的に移動する | 要素が移動し、空いた場所が埋められる(例:0) | |
| 例: | [1,2,3,4] → [3,4,1,2] |
[1,2,3,4] → [0,1,2,3] |
| データ損失 | いいえ | はい |
| 使用法 | 循環転位 | キューの実装 |
まとめると、
回転は可逆的ですが、シフトは通常は可逆的ではありません。
28) 最大積部分配列を見つけるにはどうすればよいでしょうか?
カダンのアルゴリズムに似ていますが、 track は負の値のため、最大積と最小積の両方になります。
アルゴリズム:
- 初期化します
max_ending_here = min_ending_here = arr[0]. - 現在の要素に基づいて両方を反復して更新します。
- トラック
max_so_far.
例:
入力: [2,3,-2,4] → 出力: 6 (サブ配列 [2,3])
複雑: の上)、 スペース: O(1)
29) 与えられた合計を持つサブ配列の数を効率的に数えるにはどうすればよいでしょうか?
アプローチ(プレフィックスサム + ハッシュマップ):
- 反復中に実行中の合計を維持します。
- 各プレフィックスの合計について、
(current_sum - target)ハッシュマップ内に存在します。 - それに応じてカウントを増やします。
例:
arr = [10,2,-2,-20,10], target = -10 Output = 3 subarrays
時間計算量: O(N)
スペースの複雑さ: O(N)
30) 配列問題におけるビット操作とは何ですか? また、どこで適用されますか?
ビット操作 AND、OR、XOR、シフトなどの演算を実行して、問題を効率的に解決します。
一般的なアプリケーション:
- XOR を使用して単一の非繰り返し要素を検索します。
- ビットマスクを使用してサブセットが存在するかどうかを確認します。
- セットをビットベクトルとして表現します。
例:
他の要素が 2 回出現するときに 1 回出現する要素を見つけます。
int res = 0; for (int num : arr) res ^= num;
Advantages:
- 一定の空間
- 高速論理計算
31) マトリックスを螺旋順に走査するにはどうすればよいでしょうか?
A 螺旋横断 時計回り方向に層ごとにすべての行列要素を訪問します。
アルゴリズム:
- 4 つの境界を定義します。
top,bottom,left,right. - 左→右、上→下、右→左、下→上の順にトラバースします。
- すべての要素がカバーされるまで、各パスの後に境界を縮小します。
例:
Input: 1 2 3 4 5 6 7 8 9 Output: [1,2,3,6,9,8,7,4,5]
複雑:
時間: O(n×m) | 空間: O(1)
32) 配列をソートする方法にはどのようなものがありますか?例を挙げて説明してください。
ソートは要素を特定の順序に並べ替えます。アルゴリズムの選択は、 データサイズ、分布、メモリ制約.
| アルゴリズム | 最良の場合 | 平均的なケース | 安定した | 宇宙 |
|---|---|---|---|---|
| Bubble 並べ替え | O(N) | O(n²) | はい | O(1) |
| マージソート | O(n log n) | O(n log n) | はい | O(N) |
| クイックソート | O(n log n) | O(n²) | いいえ | O(log n) |
| ヒープソート | O(n log n) | O(n log n) | いいえ | O(1) |
例 (Python クイックソート):
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
return quicksort([x for x in arr if x < pivot]) + [x for x in arr if x == pivot] + quicksort([x for x in arr if x > pivot])
33) 配列内の 2 ポインター手法について説明します。
その ツーポイントテクニック 2 つのインデックスを使用して、異なる端または速度からデータ構造をトラバースし、時間と空間を最適化します。
一般的な用途:
- ソートされた配列内で指定された合計を持つペアを検出します。
- 重複をその場で削除します。
- Rev配列をersingします。
- 間隔を結合します。
例(ペアリング Target 和):
arr = [1,2,3,4,6], target = 6
left, right = 0, len(arr)-1
while left < right:
s = arr[left] + arr[right]
if s == target: print(arr[left], arr[right])
elif s < target: left += 1
else: right -= 1
複雑: O(N)
34) 配列内の多数派要素を見つけるにはどうすればよいでしょうか?
A 多数派要素 ⌊n/2⌋ 回以上出現します。
ボイヤー・ムーア投票アルゴリズム これを線形時間と定数空間で解きます。
アルゴリズムの手順:
- 初期化します
candidate(NAIST) とcount = 0. - 各要素について:
- count = 0の場合、設定
candidate = element. - 等価性に基づいてカウントを増分/減分します。
- count = 0の場合、設定
- 候補者を確認します。
例: [3,2,3] → 出力: 3
複雑: O(N)
35) 二分探索と指数探索の違いは何ですか?
| 機能 | バイナリ検索 | 指数探索 |
|---|---|---|
| 要件 | ソートされた配列 | ソートされた配列 |
| キーアイデア | 配列を半分に分割する | 二分探索の前に指数関数的に範囲を見つける |
| 複雑 | O(log n) | O(log n) |
| Use Case | 既知のサイズ | 未知または無限の配列 |
例:
大規模なデータセットや無制限の配列(ページ区切りの API など)の場合、指数検索によって範囲を効率的に検索できます。
36) 配列内の k 番目に小さい要素または大きい要素を見つけるにはどうすればよいですか?
アプローチ:
- 並べ替え: 並べ替えとアクセス
k-1番目のインデックス(O(n log n))。 - 最小/最大ヒープ: 頻繁なクエリに効率的です (O(n log k))。
- クイックセレクト(ホーアのアルゴリズム): 平均O(n)。
例 (Python heapq を使用):
import heapq arr = [3,2,1,5,6,4] k = 2 print(heapq.nlargest(k, arr)[-1]) # 5
使用事例: リーダーボード、トップパフォーマンスのメトリック、パーセンタイル分析。
37) 1 から n までの配列で欠落している数字と重複している数字をどのように見つけますか?
1 から n までの数字 (1 つは欠落、1 つは重複) を含む配列があるとします。
アプローチ1(数学的):
実際の合計と期待値との差と二乗和を使用します。
アプローチ2(XOR方式):
- すべての配列要素と 1…n の XOR をとります。
- 結果は、欠落した数字と重複した数字の XOR になります。
- 右端の設定されたビットを使用して除算します。
複雑: の上)、 スペース: O(1)
例:
Input: [4,3,6,2,1,1] Output: Missing = 5, Repeating = 1
38) 配列内の反転カウントとは何ですか? また、それを計算するにはどうすればよいですか?
An 反転 は(i, j)のペアであり、 i < j (NAIST) と arr[i] > arr[j].
アプローチ:
- ナイーブ: すべてのペアをチェックする → O(n²)。
- 最適化(マージソート): マージ中の反転をカウント → O(n log n)。
例:
Input: [8, 4, 2, 1] Inversions = 6 → (8,4), (8,2), (8,1), (4,2), (4,1), (2,1)
で使われる 測定アレイの乱れ (NAIST) と ランキングシステム.
39) ソートされた 2 つの配列の中央値を求めるにはどうすればよいでしょうか?
最適アプローチ(二分探索):
両方の配列を、左半分と右半分に同じ数の要素が含まれるように分割します。
アルゴリズム:
- 小さい配列ではバイナリ検索を使用します。
- パーティションの境界を比較します。
- パーティション値に基づいて中央値を返します。
複雑: O(log(min(n, m)))
例:
A = [1,3], B = [2] Median = 2.0
40) リンクリストではなく配列を使用する利点は何ですか?
| 因子 | 配列 | リンクリスト |
|---|---|---|
| メモリ | 隣接する | 非連続 |
| アクセス時間 | O(1) | O(N) |
| 挿入/削除 | 高価な | 効率的な |
| キャッシュの局所性 | 素晴らしい | 最低 |
| オーバーヘッド | なし | 追加のポインタストレージ |
まとめ:
配列はランダム アクセスを必要とする固定サイズのデータセットに最適ですが、リンク リストは動的な挿入と削除に適しています。
41) 円形部分配列の最大合計を求めるにはどうすればよいでしょうか?
で 円形配列、要素は最後に折り返されます。
アプローチ:
- 正規分布の最大部分配列の合計を求める カダネのアルゴリズム.
- 最小のサブ配列の合計を見つけます。
- 結果 =
max(normal_max, total_sum - min_subarray).
エッジケース: すべての要素が負の場合、最大の要素を返します。
例:
Input: [5, -2, 3, 4] Normal Max = 10, Circular Max = 12 → Output = 12
複雑: O(N)
42) 回転してソートされた配列内の要素を検索するにはどうすればよいですか?
使用 修正二分探索 ピボットを見つけて比較を調整します。
アルゴリズム:
- 中間値 = (低値 + 高値) / 2 を求めます。
- チェックする
arr[mid] == target. - 左半分がソートされている場合 → 左を検索します。そうでない場合は右を検索します。
例:
Input: [4,5,6,7,0,1,2], target = 0 Output: Index = 4
時間計算量: O(log n)
43)「最大和増加部分列」に対する動的計画法のアプローチを説明してください。
目標は、増加する部分列の最大合計を見つけることです。
アルゴリズム:
- 初期化します
dp[i] = arr[i]. - それぞれについて、
i、前の要素をチェックj < i:- If
arr[j] < arr[i]をタップし、その後、dp[i] = max(dp[i], arr[i] + dp[j]).
- If
- 最大値を返す
dp.
例:
Input: [1, 101, 2, 3, 100, 4, 5] Output: 106 (1 + 2 + 3 + 100)
時間: O(n²) | スペース: O(N)
44)「罠」とは何かping 雨水問題とその解決策とは?
この典型的な配列の問題は、降雨後にバーの間にどれだけの水を閉じ込めることができるかを問うものです。
アプローチ(2つのポイント):
- 初期化します
left,right,left_max,right_max. - ポインタを内側に移動して、閉じ込められた水を更新します =
min(left_max, right_max) - height[i].
例:
Input: [0,1,0,2,1,0,1,3,2,1,2,1] Output: 6
| アプローチ | 時間 | 宇宙 |
|---|---|---|
| 強引な | O(n²) | O(1) |
| 動的計画法 | O(N) | O(N) |
| 2つのポインター | O(N) | O(1) |
45) 合計がゼロになる最長の部分配列を見つけるにはどうすればよいでしょうか?
アルゴリズム(ハッシュマップ):
- プレフィックスの合計を格納するハッシュ マップを初期化します。
- 同じプレフィックスの合計が再度出現する場合、インデックス間のサブ配列の合計はゼロになります。
例:
Input: [15, -2, 2, -8, 1, 7, 10, 23] Output: Length = 5 (Subarray [-2, 2, -8, 1, 7])
複雑: O(N)
46) 多次元配列の浅いフラット化と深いフラット化の違いは何ですか?
| タイプ | 例: | |
|---|---|---|
| 浅い平坦化 | 1レベルのみ平坦化します | [[1,2],[3,[4]]] → [1,2,3,[4]] |
| ディープフラットニング | すべてのネストされた配列を完全にフラット化します | [[1,2],[3,[4]]] → [1,2,3,4] |
例 (Python):
import itertools shallow = list(itertools.chain.from_iterable(arr))
使用事例: データのクリーニングや階層的なデータの正規化に役立ちます。
47) 行列 (2D 配列) 内の平衡要素を見つけるにはどうすればよいでしょうか?
An 平衡要素 行列内の要素は 行と列の合計 バランスが取れています。
アルゴリズム:
- 行と列の合計を事前に計算します。
- 各要素について、
row_sum[i] - arr[i][j] == col_sum[j] - arr[i][j].
例:
マトリックス:
Matrix: 2 7 5 3 1 1 4 6 8 Output: Element 1 at (1,1)
複雑: O(n²)
48) 配列を等しい合計を持つ 2 つのサブセットに分割するにはどうすればよいですか?
これは 部分集合和問題、を使用して解決 動的計画法.
アプローチ:
- 合計を計算します。
- 奇数の場合→Falseを返します。
- DPテーブルを作成してサブセットをチェックする
sum/2存在しています。
例:
Input: [1,5,11,5] Output: True (Subsets: [1,5,5] and [11])
時間: O(n × 合計/2) | スペース: O(合計/2)
49) 行列を時計回りに 90 度回転させるにはどうすればよいでしょうか?
アルゴリズム:
- 行列を転置します。
- Reverse 各行。
例:
Input: 1 2 3 4 5 6 7 8 9 Output: 7 4 1 8 5 2 9 6 3
複雑: O(n²)、 インプレース。
で使われる 画像処理 (NAIST) と データ視覚化変換。
50) 配列の最も一般的な実際の用途は何ですか?
配列は、数多くの計算システムや現実世界のシステムの基礎となります。
用途:
- データベースのインデックス作成: レコードの保存と並べ替え。
- 機械学習: 特徴ベクトル、行列、テンソル。
- 画像処理: 2D および 3D ピクセル データ。
- Operaシステム: メモリとプロセスのスケジューリング。
- ネットワーキング: パケットのバッファリングとルーティング。
- ゲーム: プレイヤーの状態 tracキングとグリッド。
| ドメイン | 配列の役割 |
|---|---|
| AI / ML | テンソルと行列の表現 |
| DBMS | インデックス作成と検索最適化 |
| 組込みシステム | リアルタイムセンサーデータ |
| クラウドコンピューティング | 負荷分散アレイ |
配列は、 効率的なデータ編成、計算、スケーラビリティのためのバックボーン.
🔍 現実世界のシナリオと戦略的回答を備えたトップアレイ面接質問
1) 配列とは何ですか? 他のデータ構造とどう違うのですか?
応募者に期待すること: 面接官は、配列の目的、構造、リンク リストやハッシュ マップなどの他のデータ型との違いなど、配列に関する基本的な理解を評価したいと考えています。
回答例:
「配列とは、連続したメモリ位置に格納された要素の集合であり、各要素にはインデックスを用いてアクセスできます。連結リストとは異なり、配列は要素への定数時間アクセス(O(1))を提供しますが、作成時に固定サイズを定義する必要があります。そのため、読み取り操作には効率的ですが、挿入や削除には柔軟性が低くなります。」
2) 配列内の最大要素と最小要素を効率的に見つけるにはどうすればよいでしょうか?
応募者に期待すること: 面接官は、アルゴリズム的な思考とパフォーマンスを最適化する能力をチェックしたいと考えています。
回答例:
「配列内の最大要素と最小要素の両方を効率的に見つけるには、配列を一度反復処理し、ping trac現在の最大値と最小値のk個。このアプローチは時間計算量がO(n)、空間計算量がO(1)であり、この問題にとって最適である。」
3) ソートされていない配列から重複を削除する方法を説明してください。
応募者に期待すること: 面接官は、このタスクの達成に役立つ配列操作とデータ構造に関する知識を評価したいと考えています。
回答例:
「配列を反復処理する際に、一意の要素を格納するためにハッシュセットを使用します。要素が既にセット内に存在する場合はスキップし、そうでない場合は追加します。この方法により、時間計算量O(n)、空間計算量O(n)で、重複を効率的に削除できます。」
4) 配列ソートの仕組みと、一般的なアルゴリズムをいくつか教えてください。
応募者に期待すること: 面接官は、さまざまなソートアルゴリズムとその使用例に精通していることを期待しています。
回答例:
「配列のソートは、クイックソート、マージソート、 Bubbleソート。クイックソートはO(n log n)の複雑度を持つ平均的なケースでは効率的ですが、マージソートは安定性があるため大規模なデータセットに適しています。 Bubbleソートは単純ですが、O(n²)のパフォーマンスのためにほとんど使用されません。」
5) 配列を多用するプログラムを最適化したときのことを教えてください。
応募者に期待すること: 面接官は、あなたの問題解決アプローチとパフォーマンスを向上させる能力を理解したいと考えています。
回答例:
「以前の職務では、配列に対する多重ネストループに依存するデータ処理スクリプトを最適化しました。配列のスライスを実装し、組み込みのベクトル化演算を使用することで、実行時間を約60%短縮し、システムの応答性を大幅に向上させることができました。」
6) 範囲外の配列インデックスエラーをどのように処理しますか?
応募者に期待すること: 面接官は、エラー処理と安全なコーディングの実践に関する理解を確認しています。
回答例:
「すべてのインデックスアクセスは、使用前に配列の長さの範囲内であるかどうかをチェックすることで検証されるようにします。さらに、予期せぬ範囲外エラーを適切に処理するために、try-catchメカニズムまたは同等のエラー処理メソッドを実装します。」
7) 追加のメモリを使用せずに配列を反転するにはどうすればよいですか?
応募者に期待すること: 面接官は、アルゴリズムの効率性とインプレース操作の理解度を評価したいと考えています。
回答例:
「配列の先頭から始まるポインタと末尾から始まるポインタの2つを使用します。スワップによってping これらの位置にある要素を操作し、両方のポインタを中央に向かって移動させることで、配列をその場で反転させることができ、時間計算量はO(n)、空間計算量はO(1)となる。
8) 大規模な配列データセットを管理しなければならなかった状況について説明してください。パフォーマンスと精度をどのように確保しましたか?
応募者に期待すること: 面接官は、現実世界のデータ管理とパフォーマンスの最適化を処理する能力を評価したいと考えています。
回答例:
前職では、金融データ分析のために大規模な数値配列を扱っていました。パフォーマンスを維持するために、効率的なメモリ管理技術とバッチ処理を採用しました。また、NumPy配列を活用してベクトル演算を実行し、精度と実行速度の両方を向上させました。
9) ソートされた配列内の特定の値を検索するには、どのような手順を実行しますか?
応募者に期待すること: 面接官は、検索アルゴリズムに関する知識を示すことを期待しています。
回答例:
「ソートされた配列の場合、探索範囲を繰り返し半分に分割する二分探索アルゴリズムを使用します。このアプローチにより、時間計算量はO(log n)に削減され、大規模なデータセットでは線形探索よりもはるかに効率的になります。」
10) 配列はソフトウェア開発における現実世界の問題を解決する上でどのような役割を果たすのでしょうか?
応募者に期待すること: 面接官は、技術的な知識を実際の応用にどのように結び付けているかを理解したいと考えています。
回答例:
配列は効率的なデータの保存と取得をサポートするため、ソフトウェア開発において不可欠です。例えば、前職では、分析ダッシュボードのキャッシュメカニズムとデータのソートを実装するために配列を使用しました。これにより、データへのアクセス性が向上し、クエリの応答時間が短縮されました。
