คำถามและคำตอบสัมภาษณ์อาร์เรย์ 50 อันดับแรก (2026)
เตรียมตัวสัมภาษณ์งานกับ Array หรือยัง? ถึงเวลาแล้วที่จะโฟกัสกับคำถามที่คุณอาจเจอ ความเข้าใจใน {{keyword}} ช่วยให้ผู้สมัครสามารถแสดงจุดแข็งด้านการคิดวิเคราะห์ ตรรกะ และการแก้ปัญหาได้อย่างมีประสิทธิภาพ
อาร์เรย์เป็นรากฐานของประสบการณ์ทางเทคนิคและประสบการณ์ทางวิชาชีพสำหรับโปรแกรมเมอร์ ตั้งแต่ผู้เริ่มต้นจนถึงมืออาชีพอาวุโส การเชี่ยวชาญอาร์เรย์แสดงให้เห็นถึงความเชี่ยวชาญทางเทคนิคที่แข็งแกร่งและประสบการณ์ระดับรากหญ้าในการจัดการข้อมูล นายจ้างให้คุณค่ากับทักษะดังกล่าวในระหว่างการถามตอบping ผู้สมัครสอบผ่านรอบคำถามทั่วไป คำถามขั้นสูง หรือการสอบสัมภาษณ์ ด้วยการวิเคราะห์อย่างมั่นใจและทักษะเชิงปฏิบัติ
คอลเลกชันนี้ซึ่งรวบรวมจากข้อมูลเชิงลึกของผู้นำทางเทคนิค ผู้จัดการ และผู้เชี่ยวชาญกว่า 85 ราย ครอบคลุมมุมมองที่หลากหลายในอุตสาหกรรมต่างๆ เพื่อให้แน่ใจว่าหัวข้อต่างๆ ในแต่ละหัวข้อสะท้อนถึงความคาดหวังในการจ้างงานที่แท้จริงและมาตรฐานการประเมินการเขียนโค้ดในโลกแห่งความเป็นจริง

คำถามและคำตอบสัมภาษณ์ Top Array
1) อธิบายว่าอาร์เรย์คืออะไรและแตกต่างจากโครงสร้างข้อมูลอื่นอย่างไร
อาร์เรย์คือบล็อกหน่วยความจำแบบต่อเนื่องที่จัดเก็บองค์ประกอบหลายองค์ประกอบที่มีชนิดข้อมูลเดียวกัน อาร์เรย์อนุญาตให้เข้าถึงองค์ประกอบใดๆ ได้ตลอดเวลาโดยใช้ดัชนี ทำให้เป็นหนึ่งในโครงสร้างที่มีประสิทธิภาพสูงสุดสำหรับการเข้าถึงแบบสุ่ม อาร์เรย์ต่างจากรายการแบบลิงก์ ตรงที่อาร์เรย์มีขนาดคงที่และไม่มีค่าใช้จ่ายในการจัดเก็บตัวชี้ อาร์เรย์จะได้รับความนิยมเมื่อทราบจำนวนองค์ประกอบล่วงหน้า ในขณะที่โครงสร้างแบบไดนามิก เช่น รายการหรือเวกเตอร์ จะถูกใช้เมื่อคาดว่าจะมีการปรับขนาดบ่อยครั้ง
| คุณสมบัติ (Feature) | แถว | รายการที่เชื่อมโยง |
|---|---|---|
| การจัดสรรหน่วยความจำ | ติดกัน | ไม่ต่อเนื่องกัน |
| เวลาเข้าถึง | O (1) | O (n) |
| การแทรก/การลบ | แพง | ที่มีประสิทธิภาพ |
| โอเวอร์เฮดหน่วยความจำ | ต่ำ | สูง (ตัวชี้) |
👉 ดาวน์โหลด PDF ฟรี: คำถามและคำตอบสัมภาษณ์แบบอาร์เรย์
2) อาร์เรย์มีกี่ประเภท? จงยกตัวอย่างประกอบ
อาร์เรย์ถูกจัดประเภทตามขนาดและการใช้งาน ประเภทหลักๆ ประกอบด้วย:
- อาร์เรย์หนึ่งมิติ: จัดเก็บองค์ประกอบแบบเชิงเส้น เช่น
int arr[5] = {1,2,3,4,5}. - อาร์เรย์สองมิติ: แสดงข้อมูลในรูปแบบตาราง เช่น เมทริกซ์
- อาร์เรย์หลายมิติ: มิติที่สูงกว่า มักใช้ในการจำลองหรือการประมวลผลภาพ
- อาร์เรย์แบบไดนามิก: ปรับขนาดโดยอัตโนมัติเมื่อมีการเพิ่มองค์ประกอบ เช่น
ArrayListin Java,vectorin C++.
| ประเภท | โครงสร้าง | ตัวอย่าง |
|---|---|---|
| 1D | วัดเชิงเส้น | [1, 2, 3] |
| 2D | มดลูก | [[1, 2], [3, 4]] |
| พลวัต | ปรับขนาดได้ | std::vector<int> |
3) คุณจะค้นหาองค์ประกอบที่ใหญ่ที่สุดและเล็กที่สุดในอาร์เรย์ได้อย่างไร
ปัญหานี้มักได้รับการแก้ไขโดยใช้การท่องแบบเชิงเส้น (Linear Traversal) คุณรักษาตัวแปรสองตัว — ตัวหนึ่งสำหรับค่าต่ำสุด และอีกตัวหนึ่งสำหรับค่าสูงสุด — และอัปเดตตัวแปรเหล่านี้ในระหว่างการวนซ้ำ
ขั้นตอนวิธีการ:
- เริ่มต้น
minและ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)) |
| หน่วยความจำ | ที่เก็บข้อมูลขนาดกะทัดรัด | การจัดสรรขนาดคงที่ |
| การดำเนินงาน | ไวยากรณ์ง่าย | ไม่มีการตรวจสอบขอบเขตในบางภาษา |
| ใช้กรณี | เหมาะสำหรับชุดข้อมูลคงที่ | ไม่มีประสิทธิภาพในการปรับเปลี่ยนบ่อยครั้ง |
5) อธิบายความแตกต่างระหว่างอาร์เรย์แบบคงที่และแบบไดนามิก
A อาร์เรย์คงที่ มีขนาดคงที่ที่กำหนดไว้ในเวลาคอมไพล์ ในขณะที่ ไดนามิกอาร์เรย์ สามารถขยายหรือหดตัวได้ในระหว่างรันไทม์ อาร์เรย์แบบคงที่มีประสิทธิภาพในหน่วยความจำแต่มีความยืดหยุ่น ในขณะที่อาร์เรย์แบบไดนามิกให้ความยืดหยุ่นโดยมีค่าใช้จ่ายเพิ่มเติมเล็กน้อยในระหว่างการปรับขนาด
| คุณสมบัติ (Feature) | อาร์เรย์แบบคงที่ | อาร์เรย์แบบไดนามิก |
|---|---|---|
| ขนาด | คงที่ | ตัวแปร |
| หน่วยความจำ | กอง | กอง |
| ตัวอย่าง | int arr[5]; |
std::vector<int> |
| ปรับขนาด | ไม่ได้รับการสนับสนุน | ที่สนับสนุน |
ตัวอย่างกรณีการใช้งาน:
ใช้อาร์เรย์คงที่ในระบบฝังตัวและอาร์เรย์แบบไดนามิกสำหรับคอลเลกชันที่มีขนาดไม่สามารถคาดเดาได้
6) คุณสามารถย้อนกลับอาร์เรย์ในสถานที่ได้อย่างไร?
Revการแทนที่อาร์เรย์ในตำแหน่งเดิมเกี่ยวข้องกับการสลับping องค์ประกอบจากทั้งสองด้านเคลื่อนตัวเข้าสู่จุดศูนย์กลาง
ขั้นตอนวิธีการ:
- เริ่มต้นตัวชี้สองตัว:
start = 0และend = n - 1. - สลับองค์ประกอบ
arr[start]และarr[end]. - การเพิ่มขึ้น
startและการลดลงendจนกระทั่งพวกเขาพบกัน
ตัวอย่าง (Python):
arr = [1, 2, 3, 4, 5] arr.reverse() # Built-in method # or manually arr = arr[::-1]
ความซับซ้อนของเวลา: บน), ความซับซ้อนของอวกาศ: โอ(1).
7) ความแตกต่างระหว่าง Jagged Array กับ Multidimensional Array คืออะไร?
A อาร์เรย์หยัก เป็นอาร์เรย์ของอาร์เรย์ โดยที่อาร์เรย์ภายในสามารถมีความยาวต่างกันได้ ในขณะที่ อาร์เรย์หลายมิติ มีขนาดแถวและคอลัมน์ที่สม่ำเสมอ
| คุณสมบัติ (Feature) | อาร์เรย์แบบหยัก | อาร์เรย์หลายมิติ |
|---|---|---|
| โครงสร้าง | ไม่สม่ำเสมอ (อาร์เรย์ซ้อนกัน) | สี่เหลี่ยมผืนผ้า (เมทริกซ์) |
| หน่วยความจำ | ไม่ต่อเนื่องกัน | ติดกัน |
| ทางเข้า | 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):
XOR ทุกองค์ประกอบที่มีตัวเลขตั้งแต่ 1 ถึง n ค่าที่เหลือคือตัวเลขที่หายไป
ตัวอย่าง:
ใช้เพื่อการ [1,2,4,5,6] (n=6):
ผลรวมที่คาดหวัง = 21, ผลรวมจริง = 18 → หายไป = 3
ความซับซ้อนของเวลา: บน), ความซับซ้อนของอวกาศ: โอ(1).
9) มีวิธีใดบ้างในการลบข้อมูลที่ซ้ำกันออกจากอาร์เรย์?
มีหลายวิธีขึ้นอยู่กับภาษาและข้อจำกัด:
- การใช้ HashSet: เก็บเฉพาะองค์ประกอบที่ไม่ซ้ำกันเท่านั้น
- การใช้การเรียงลำดับ: เรียงลำดับอาร์เรย์และลบรายการที่ซ้ำกันที่อยู่ติดกัน
- การใช้แผนที่ความถี่: Track จำนวนของแต่ละองค์ประกอบ
ตัวอย่าง (Java):
Set<Integer> unique = new HashSet<>(Arrays.asList(arr));
| เข้าใกล้ | เวลา | ช่องว่าง |
|---|---|---|
| แฮชเซ็ต | O (n) | O (n) |
| การเรียงลำดับ | O (n บันทึก n) | O (1) |
| เวลา | O (n) | O (n) |
10) คุณจะค้นหาองค์ประกอบที่ใหญ่เป็นอันดับสองในอาร์เรย์ได้อย่างไร
คุณสามารถค้นหาองค์ประกอบที่ใหญ่เป็นอันดับสองได้โดยใช้การสืบค้นครั้งเดียวโดยการรักษาตัวแปรสองตัว
ขั้นตอนวิธีการ:
- เริ่มต้น
firstและ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;
}
}
ความซับซ้อนของเวลา: บน), ความซับซ้อนของอวกาศ: โอ(1).
11) คุณจะหมุนอาร์เรย์ได้ 'k' ตำแหน่งได้อย่างไร? อธิบายวิธีการต่างๆ
การหมุนอาร์เรย์จะเลื่อนองค์ประกอบแบบวนรอบ มี สามวิธีหลัก เพื่อให้บรรลุ:
- การใช้ Temporary Array: คัดลอกองค์ประกอบ k แรกและผนวกเข้าในตอนท้ายหลังจากเลื่อนองค์ประกอบอื่นๆ
- การใช้ Revอัลกอริทึม ersal: Reverse อาร์เรย์ประกอบด้วยสามส่วน ได้แก่ ส่วนแรก ส่วนที่สอง และอาร์เรย์ทั้งหมด
- การใช้อัลกอริทึมการเล่นกล: อ้างอิงจาก GCD ของ n และ k (มีประสิทธิภาพใน O(n))
ตัวอย่าง (การหมุนขวา 2):
Input: [1,2,3,4,5] Output: [4,5,1,2,3]
| วิธี | เวลา | ช่องว่าง | Descriptไอออน |
|---|---|---|---|
| อาร์เรย์ชั่วคราว | O (n) | ตกลง) | เรียบง่ายและใช้งานง่าย |
| Revเออร์ซัล | O (n) | O (1) | ในสถานที่และมีประสิทธิภาพ |
| การเล่นกล | O (n) | O (1) | อิงตามรอบ GCD |
12) Subarray คืออะไร และแตกต่างจาก Subsequence อย่างไร
A อาร์เรย์ย่อย เป็นส่วนที่ต่อเนื่องกันของอาร์เรย์ ในขณะที่ ลำดับย่อย รักษาความเป็นระเบียบแต่สามารถข้ามองค์ประกอบได้
| อสังหาริมทรัพย์ | ซับอาร์เรย์ | ลำดับย่อย |
|---|---|---|
| ติดกัน | มี (ใบกำกับภาษีเต็มรูปแบบ) | ไม่ |
| คำสั่งเก็บรักษาไว้ | มี (ใบกำกับภาษีเต็มรูปแบบ) | มี (ใบกำกับภาษีเต็มรูปแบบ) |
| ตัวอย่าง (จาก [1,2,3]) | [1,2] | [1,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 คือค่าสูงสุดทั่วโลก
ตัวอย่าง:
Input: [-2,1,-3,4,-1,2,1,-5,4] → เอาท์พุต: 6 (ซับบาร์เรย์ [4,-1,2,1]).
ซับซ้อน:
เวลา O(n) พื้นที่ O(1)
14) คุณสามารถรวมอาร์เรย์ที่เรียงลำดับแล้วสองอาร์เรย์โดยไม่ต้องใช้พื้นที่เพิ่มเติมได้อย่างไร
การผสานอาร์เรย์ที่เรียงลำดับสองชุดเข้าด้วยกัน ในสถานที่ความคิดคือการเปรียบเทียบจากจุดสิ้นสุดของอาร์เรย์ทั้งสอง
วิธีการ:
- เริ่มจากองค์ประกอบที่ถูกต้องสุดท้ายของอาร์เรย์ทั้งสอง
- เปรียบเทียบและย้ายอันที่ใหญ่กว่าไปยังจุดสิ้นสุดของพื้นที่รวม
- ทำซ้ำจนกระทั่งทุกองค์ประกอบรวมกันหมด
ตัวอย่าง (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--];
}
ความซับซ้อนของเวลา: โอ(ม+น).
15) มีวิธีต่างๆ อะไรบ้างในการค้นหาองค์ประกอบในอาร์เรย์?
| วิธี | ประเภท | ความซับซ้อนของเวลา | ตัวอย่างการใช้งาน |
|---|---|---|---|
| การค้นหาเชิงเส้น | ไม่เรียงลำดับ | O (n) | การค้นหาทั่วไป |
| การค้นหาแบบไบนารี | เรียง | O (บันทึก n) | การค้นหาที่มีประสิทธิภาพ |
| hashing | ไม่เรียงลำดับ | ค่าเฉลี่ย 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.
เวลา: บน), พื้นที่: โอ(1).
18) Sparse Array คืออะไร และมีประโยชน์อย่างไร?
A อาร์เรย์กระจัดกระจาย ส่วนใหญ่มีค่าเป็นศูนย์หรือค่าเริ่มต้น แทนที่จะเก็บองค์ประกอบทั้งหมด เราจะเก็บเฉพาะรายการที่ไม่ใช่ศูนย์พร้อมดัชนีขององค์ประกอบเหล่านั้น
ข้อดี:
- ช่วยประหยัดหน่วยความจำ
- มีประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่ เช่น เมทริกซ์หรือความถี่ของเงื่อนไขเอกสาร
| ประเภท | ตัวอย่าง | ใช้กรณี |
|---|---|---|
| อาร์เรย์หนาแน่น | [0,1,0,2,3] |
ข้อมูลขนาดเล็ก |
| อาร์เรย์แบบเบาบาง | {1:1, 3:2, 4:3} |
ข้อมูลเบาบางขนาดใหญ่ |
ตัวอย่าง: ใช้ในโมเดลการเรียนรู้ของเครื่อง (เมทริกซ์ TF-IDF)
19) คุณสามารถค้นหาจุดตัดของอาร์เรย์ทั้งสองอย่างมีประสิทธิภาพได้อย่างไร
สามารถค้นหาจุดตัดได้โดยใช้เทคนิคการแฮชหรือการเรียงลำดับ
- การใช้ HashSet: เพิ่มองค์ประกอบของอาร์เรย์แรก จากนั้นตรวจสอบสมาชิกภาพของอาร์เรย์ที่สอง
- การใช้ตัวชี้สองตัว: ใช้งานได้กับอาร์เรย์ที่มีการเรียงลำดับ
ตัวอย่าง (Python):
intersection = list(set(arr1) & set(arr2))
ซับซ้อน:
- ชุดแฮช: O(n)
- ตัวชี้สองตัว: O(n log n) เนื่องจากการเรียงลำดับ
20) อธิบายความแตกต่างระหว่างลำดับแถวหลักและคอลัมน์หลักในอาร์เรย์
เหล่านี้เป็นคำสั่งจัดเก็บหน่วยความจำที่ใช้สำหรับอาร์เรย์หลายมิติ
| แนวคิด | โรว์เมเจอร์ (ซี/C++) | คอลัมน์หลัก (Fortraน., 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 Sum คืออะไร และใช้ในอาร์เรย์อย่างไร
การขอ ผลรวมคำนำหน้า เทคนิคนี้เกี่ยวข้องกับการคำนวณผลรวมสะสมล่วงหน้าของอาร์เรย์เพื่อตอบคำถามช่วงอย่างมีประสิทธิภาพ
แนวคิด:
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องค์ประกอบ - เลื่อนหน้าต่างทีละองค์ประกอบ
- เพิ่มองค์ประกอบใหม่ ลบองค์ประกอบแรกออก และ track คือค่าสูงสุด
ความซับซ้อนของเวลา: O(n) — เร็วกว่าวิธี O(n×k) แบบไร้เดียงสามาก
การใช้งาน:
ใช้ในปัญหาเช่นค่าเฉลี่ยสูงสุดของซับอาร์เรย์ ซับสตริงที่ยาวที่สุด หรือตัวเลขติดลบตัวแรกในแต่ละหน้าต่าง
23) ความแตกต่างระหว่างอาร์เรย์และตัวชี้ในภาษา C คืออะไร?
| คุณสมบัติ (Feature) | แถว | ตัวชี้ |
|---|---|---|
| คำนิยาม | การรวบรวมองค์ประกอบข้อมูลที่คล้ายกัน | ตัวแปรที่เก็บที่อยู่หน่วยความจำ |
| การจัดสรรหน่วยความจำ | ติดกัน | แบบไดนามิกหรือตามอำเภอใจ |
| ขนาด | คงที่ | สามารถปรับขนาดได้ |
| ตัวอย่าง | 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): สามอาร์เรย์:
values,col_index,row_pointer. - พจนานุกรมคีย์ (DOK): แผนที่แฮชของ (แถว, คอลัมน์) → ค่า
| วิธี | ประสิทธิภาพของหน่วยความจำ | ตัวอย่างการใช้งาน |
|---|---|---|
| ประธานเจ้าหน้าที่ฝ่ายปฏิบัติการ | ปานกลาง | ที่เก็บของทั่วไป |
| ความรับผิดชอบต่อสังคม | จุดสูง | การคำนวณเชิงตัวเลข |
| ดอก | เรามีความยืดหยุ่น | การแทรกแบบไดนามิก |
ใช้กันอย่างแพร่หลายใน เรียนรู้เครื่อง (TF-IDF, เมทริกซ์ที่อยู่ติดกันของกราฟ)
26) คุณจะจัดเรียงอาร์เรย์ใหม่เพื่อให้ตัวเลขคู่และคี่สลับกันได้อย่างไร
เป้าหมายคือการสลับตัวเลขคู่และคี่ในขณะที่ยังคงรักษาลำดับสัมพันธ์ของพวกมันไว้
ขั้นตอนวิธีการ:
- แยกอาร์เรย์คู่และคี่
- รวมกันโดยสลับกันเริ่มจากคู่หรือคี่
- หากประเภทหนึ่งหมด ให้ผนวกประเภทที่เหลือ
ตัวอย่าง:
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) จะค้นหาผลคูณสูงสุดในอาร์เรย์ย่อยได้อย่างไร?
คล้ายกับอัลกอริทึมของ Kadane แต่คุณ track ทั้งค่าผลคูณสูงสุดและต่ำสุดเนื่องจากค่าลบ
ขั้นตอนวิธีการ:
- เริ่มต้น
max_ending_here = min_ending_here = arr[0]. - ทำซ้ำและอัปเดตทั้งคู่ตามองค์ประกอบปัจจุบัน
- ติดตามการจัดส่ง
max_so_far.
ตัวอย่าง:
Input: [2,3,-2,4] → เอาท์พุต: 6 (ซับบาร์เรย์ [2,3])
ซับซ้อน: บน), พื้นที่: O (1)
29) คุณจะนับจำนวนซับอาร์เรย์อย่างมีประสิทธิภาพด้วยผลรวมที่กำหนดได้อย่างไร
แนวทาง (Prefix Sum + Hash Map):
- รักษาผลรวมการทำงานขณะทำการวนซ้ำ
- สำหรับผลรวมคำนำหน้าแต่ละคำ ให้ตรวจสอบว่า
(current_sum - target)มีอยู่ในแผนที่แฮช - เพิ่มจำนวนให้เหมาะสม
ตัวอย่าง:
arr = [10,2,-2,-20,10], target = -10 Output = 3 subarrays
ความซับซ้อนของเวลา: O (n)
ความซับซ้อนของอวกาศ: O (n)
30) การจัดการบิตในปัญหาอาร์เรย์คืออะไร และนำไปใช้ที่ไหน
การจัดการบิต เกี่ยวข้องกับการดำเนินการเช่น AND, OR, XOR และการเลื่อนเพื่อแก้ไขปัญหาอย่างมีประสิทธิภาพ
การใช้งานทั่วไป:
- การค้นหาองค์ประกอบเดียวที่ไม่เกิดการซ้ำโดยใช้ XOR
- การตรวจสอบว่ามีเซ็ตย่อยอยู่หรือไม่โดยใช้การมาสก์บิต
- การแสดงเซ็ตเป็นเวกเตอร์บิต
ตัวอย่าง:
ค้นหาองค์ประกอบที่ปรากฏครั้งหนึ่งในขณะที่องค์ประกอบอื่นปรากฏสองครั้ง:
int res = 0; for (int num : arr) res ^= num;
ข้อดี:
- พื้นที่คงที่
- การคำนวณเชิงตรรกะที่รวดเร็ว
31) คุณจะเคลื่อนที่ผ่านเมทริกซ์ในลำดับเกลียวได้อย่างไร
A การเคลื่อนที่แบบเกลียว เยี่ยมชมองค์ประกอบเมทริกซ์ทั้งหมดทีละชั้นในทิศทางตามเข็มนาฬิกา
ขั้นตอนวิธีการ:
- กำหนดขอบเขตสี่ประการ:
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) มีวิธีการเรียงลำดับอาร์เรย์อย่างไรบ้าง? อธิบายพร้อมยกตัวอย่าง
การเรียงลำดับจะจัดเรียงองค์ประกอบใหม่ตามลำดับที่กำหนด การเลือกอัลกอริทึมขึ้นอยู่กับ ขนาดข้อมูล การกระจาย และข้อจำกัดของหน่วยความจำ.
| ขั้นตอนวิธี | เคสที่ดีที่สุด | กรณีเฉลี่ย | มีเสถียรภาพ | ช่องว่าง |
|---|---|---|---|---|
| Bubblอีเรียงลำดับ | O (n) | โอ(n²) | มี (ใบกำกับภาษีเต็มรูปแบบ) | O (1) |
| ผสานการเรียง | O (n บันทึก n) | O (n บันทึก n) | มี (ใบกำกับภาษีเต็มรูปแบบ) | O (n) |
| จัดเรียงด่วน | O (n บันทึก n) | โอ(n²) | ไม่ | O (บันทึก n) |
| เรียงลำดับกอง | O (n บันทึก n) | O (n บันทึก 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) อธิบายเทคนิคสองจุดในอาร์เรย์
การขอ เทคนิคการแทงสองแต้ม ใช้ดัชนีสองตัวในการเคลื่อนผ่านโครงสร้างข้อมูลจากจุดสิ้นสุดหรือความเร็วที่แตกต่างกัน โดยปรับเวลาและพื้นที่ให้เหมาะสมที่สุด
การใช้งานทั่วไป:
- การตรวจจับคู่ที่มีผลรวมที่กำหนดในอาร์เรย์ที่เรียงลำดับ
- การลบรายการที่ซ้ำกันในสถานที่
- 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⌋ ครั้ง
อัลกอริทึมการลงคะแนนเสียง Boyer–Moore แก้ไขปัญหานี้ในเวลาเชิงเส้นและพื้นที่คงที่
ขั้นตอนอัลกอริทึม:
- เริ่มต้น
candidateและcount = 0. - สำหรับแต่ละองค์ประกอบ:
- ถ้า count = 0 ให้ตั้งค่า
candidate = element. - การนับเพิ่ม/ลดขึ้นอยู่กับความเท่ากัน
- ถ้า count = 0 ให้ตั้งค่า
- ตรวจสอบผู้สมัคร
ตัวอย่าง: [3,2,3] → เอาท์พุต: 3
ซับซ้อน: O (n)
35) ความแตกต่างระหว่างการค้นหาแบบไบนารีและการค้นหาแบบเอ็กซ์โพเนนเชียลคืออะไร?
| คุณสมบัติ (Feature) | การค้นหาแบบไบนารี | การค้นหาแบบเลขชี้กำลัง |
|---|---|---|
| ความต้องการ | อาร์เรย์ที่เรียงลำดับ | อาร์เรย์ที่เรียงลำดับ |
| แนวคิดหลัก | แบ่งอาร์เรย์ออกเป็นสองส่วน | ค้นหาช่วงเลขชี้กำลังก่อนการค้นหาแบบไบนารี |
| ความซับซ้อน | O (บันทึก n) | O (บันทึก n) |
| ใช้กรณี | ขนาดที่ทราบ | อาร์เรย์ที่ไม่รู้จักหรือไม่มีที่สิ้นสุด |
ตัวอย่าง:
สำหรับชุดข้อมูลขนาดใหญ่หรืออาร์เรย์ที่ไม่จำกัด (เช่น API แบบแบ่งหน้า) การค้นหาแบบเลขชี้กำลังสามารถค้นหาช่วงได้อย่างมีประสิทธิภาพ
36) คุณจะค้นหาองค์ประกอบที่เล็กที่สุดหรือใหญ่ที่สุดเป็นอันดับ k ในอาร์เรย์ได้อย่างไร
วิธีการ:
- เรียงลำดับ: การจัดเรียงและการเข้าถึง
k-1ดัชนีที่ (O(n log n)) - ฮีปต่ำสุด/สูงสุด: มีประสิทธิภาพสำหรับการค้นหาบ่อยครั้ง (O(n log k))
- QuickSelect (อัลกอริทึมของ Hoare): ค่าเฉลี่ย 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):
- XOR องค์ประกอบอาร์เรย์ทั้งหมดและ 1…n
- ผลลัพธ์จะให้ผล XOR ของตัวเลขที่หายไปและซ้ำกัน
- แบ่งโดยใช้บิตเซ็ตขวาสุด
ซับซ้อน: บน), พื้นที่: O (1)
ตัวอย่าง:
Input: [4,3,6,2,1,1] Output: Missing = 5, Repeating = 1
38) การนับการผกผันในอาร์เรย์คืออะไร และจะคำนวณได้อย่างไร
An การผกผัน เป็นคู่ (i, j) ที่ i < j และ 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)
ใช้แล้ว ความผิดปกติของอาร์เรย์การวัด และ ระบบการจัดอันดับ.
39) คุณจะหาค่ามัธยฐานของอาร์เรย์ที่เรียงลำดับสองชุดได้อย่างไร
แนวทางที่เหมาะสมที่สุด (การค้นหาแบบไบนารี):
แบ่งทั้งสองอาร์เรย์โดยให้ครึ่งซ้ายมีจำนวนองค์ประกอบเท่ากับครึ่งขวา
ขั้นตอนวิธีการ:
- ใช้การค้นหาแบบไบนารีบนอาร์เรย์ขนาดเล็ก
- เปรียบเทียบขอบเขตของพาร์ติชั่น
- คืนค่ามัธยฐานตามค่าพาร์ติชัน
ซับซ้อน: O(log(นาที(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 (บันทึก 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 ปัญหา "น้ำฝน" และจะแก้ไขได้อย่างไร?
ปัญหาอาร์เรย์คลาสสิกนี้ถามว่าน้ำสามารถกักเก็บไว้ระหว่างแท่งได้มากเพียงใดหลังฝนตก
แนวทาง (สองข้อชี้แนะ):
- เริ่มต้น
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
| เข้าใกล้ | เวลา | ช่องว่าง |
|---|---|---|
| โหดเหี้ยม | โอ(n²) | O (1) |
| การเขียนโปรแกรมแบบไดนามิก | O (n) | O (n) |
| สองพอยน์เตอร์ | O (n) | O (1) |
45) คุณจะค้นหาซับอาร์เรย์ที่ยาวที่สุดที่มีผลรวมเท่ากับศูนย์ได้อย่างไร
อัลกอริทึม (Hash Map):
- เริ่มต้นแฮชแมปเพื่อจัดเก็บผลรวมของคำนำหน้า
- หากผลรวมของคำนำหน้าเดียวกันปรากฏขึ้นอีกครั้ง อาร์เรย์ย่อยระหว่างดัชนีจะมีผลรวมเป็นศูนย์
ตัวอย่าง:
Input: [15, -2, 2, -8, 1, 7, 10, 23] Output: Length = 5 (Subarray [-2, 2, -8, 1, 7])
ซับซ้อน: O (n)
46) ความแตกต่างระหว่างการปรับแบนราบแบบตื้นและแบบลึกของอาร์เรย์หลายมิติคืออะไร
| ประเภท | คำนิยาม | ตัวอย่าง |
|---|---|---|
| การแบนราบแบบตื้น | แบนราบเพียงระดับเดียว | [[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) คุณจะค้นหาองค์ประกอบสมดุลในเมทริกซ์ (อาร์เรย์ 2 มิติ) ได้อย่างไร
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)
ซับซ้อน: โอ(n²)
48) คุณสามารถแบ่งอาร์เรย์ออกเป็นสองเซ็ตย่อยโดยให้มีผลรวมเท่ากันได้อย่างไร
ดีไซน์นี้เป็น ปัญหาผลรวมย่อย, แก้ไขโดยใช้ การเขียนโปรแกรมแบบไดนามิก.
วิธีการ:
- คำนวณผลรวมทั้งหมด
- ถ้าเป็นเลขคี่ → กลับคืนค่า 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²), อยู่ในสถานที่
ใช้แล้ว การประมวลผลภาพ และ การแปลงการแสดงภาพข้อมูล
50) แอปพลิเคชันอาร์เรย์ในโลกแห่งความเป็นจริงที่พบบ่อยที่สุดคืออะไร
อาร์เรย์ถือเป็นพื้นฐานของระบบการคำนวณและระบบโลกแห่งความเป็นจริงมากมาย
การใช้งาน:
- การจัดทำดัชนีฐานข้อมูล: การจัดเก็บและจัดเรียงบันทึก
- การเรียนรู้ของเครื่อง: เวกเตอร์คุณลักษณะ เมทริกซ์ และเทนเซอร์
- การประมวลผลภาพ: ข้อมูลพิกเซล 2 มิติ และ 3 มิติ
- Operating ระบบ: การกำหนดตารางหน่วยความจำและกระบวนการ
- เครือข่าย: การบัฟเฟอร์และการกำหนดเส้นทางแพ็กเก็ต
- เกมที่เล่น: สถานะผู้เล่น tracราชาและตาราง
| โดเมน | บทบาทของอาร์เรย์ |
|---|---|
| AI / ML | การแทนค่าเทนเซอร์และเมทริกซ์ |
| DBMS | การสร้างดัชนีและการเพิ่มประสิทธิภาพการค้นหา |
| ระบบสมองกลฝังตัว | ข้อมูลเซ็นเซอร์แบบเรียลไทม์ |
| เมฆ Computing | อาร์เรย์การกระจายโหลด |
อาร์เรย์ให้ แกนหลักสำหรับการจัดระเบียบข้อมูล การคำนวณ และการปรับขนาดอย่างมีประสิทธิภาพ.
🔍 คำถามสัมภาษณ์แบบอาร์เรย์ยอดนิยมพร้อมสถานการณ์จริงและคำตอบเชิงกลยุทธ์
1) อาร์เรย์คืออะไร และแตกต่างจากโครงสร้างข้อมูลอื่นอย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความเข้าใจพื้นฐานของคุณเกี่ยวกับอาร์เรย์ รวมถึงวัตถุประสงค์ โครงสร้าง และความแตกต่างจากประเภทข้อมูลอื่น เช่น รายการที่เชื่อมโยงหรือแผนที่แฮช
ตัวอย่างคำตอบ:
อาร์เรย์คือชุดขององค์ประกอบที่จัดเก็บอยู่ในหน่วยความจำแบบต่อเนื่อง ซึ่งแต่ละองค์ประกอบสามารถเข้าถึงได้โดยใช้ดัชนี อาร์เรย์แตกต่างจากรายการแบบลิงก์ ตรงที่ให้การเข้าถึงองค์ประกอบแบบคงที่ (O(1)) แต่จำเป็นต้องมีขนาดคงที่ที่กำหนดไว้ ณ เวลาที่สร้าง ซึ่งทำให้อาร์เรย์มีประสิทธิภาพในการอ่านข้อมูล แต่มีความยืดหยุ่นน้อยกว่าในการแทรกและลบข้อมูล
2) คุณจะค้นหาองค์ประกอบที่ใหญ่ที่สุดและเล็กที่สุดในอาร์เรย์อย่างมีประสิทธิภาพได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการตรวจสอบการคิดเชิงอัลกอริทึมและความสามารถในการเพิ่มประสิทธิภาพของคุณ
ตัวอย่างคำตอบ:
“ในการค้นหาองค์ประกอบที่ใหญ่ที่สุดและเล็กที่สุดในอาร์เรย์อย่างมีประสิทธิภาพ ฉันจะวนลูปผ่านอาร์เรย์หนึ่งครั้ง แล้วค่อยเก็บค่าที่เล็กที่สุดไว้”ping track ของค่าสูงสุดและต่ำสุดปัจจุบัน วิธีการนี้มีความซับซ้อนด้านเวลา O(n) และความซับซ้อนด้านพื้นที่ O(1) ซึ่งเหมาะสมที่สุดสำหรับปัญหานี้”
3) อธิบายว่าคุณจะลบข้อมูลซ้ำจากอาร์เรย์ที่ไม่ได้เรียงลำดับได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความรู้ของคุณเกี่ยวกับการจัดการอาร์เรย์และโครงสร้างข้อมูลที่สามารถช่วยให้บรรลุภารกิจนี้ได้
ตัวอย่างคำตอบ:
“ผมจะใช้ชุดแฮชเพื่อจัดเก็บองค์ประกอบเฉพาะขณะวนซ้ำในอาร์เรย์ หากมีองค์ประกอบอยู่ในชุดอยู่แล้ว ผมจะข้ามไป แต่ถ้าไม่มีก็จะเพิ่มเข้าไป วิธีนี้ช่วยให้มั่นใจได้ว่าข้อมูลซ้ำจะถูกลบออกอย่างมีประสิทธิภาพด้วยความซับซ้อนของเวลา O(n) และความซับซ้อนของพื้นที่ O(n)”
4) คุณสามารถอธิบายวิธีการทำงานของการเรียงลำดับอาร์เรย์และตั้งชื่ออัลกอริทึมทั่วไปบางตัวได้หรือไม่
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์คาดหวังว่าจะคุ้นเคยกับอัลกอริทึมการเรียงลำดับที่แตกต่างกันและกรณีการใช้งานของอัลกอริทึมเหล่านั้น
ตัวอย่างคำตอบ:
การเรียงลำดับอาร์เรย์สามารถทำได้โดยใช้อัลกอริทึมต่างๆ เช่น การเรียงลำดับด่วน การเรียงลำดับแบบผสาน และ Bubblการเรียงลำดับแบบรวดเร็วมีประสิทธิภาพสำหรับกรณีทั่วไปที่มีความซับซ้อน O(n log n) ในขณะที่การเรียงลำดับแบบผสานจะนิยมใช้กับชุดข้อมูลขนาดใหญ่เนื่องจากลักษณะที่เสถียร Bubble Sort แม้จะเรียบง่ายแต่ก็ไม่ค่อยได้ใช้เนื่องจากมีประสิทธิภาพการทำงานที่ระดับ O(n²)
5) เล่าให้ฉันฟังถึงเวลาที่คุณปรับแต่งโปรแกรมที่ใช้งานอาร์เรย์อย่างหนัก
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการเข้าใจแนวทางการแก้ปัญหาและความสามารถในการปรับปรุงประสิทธิภาพของคุณ
ตัวอย่างคำตอบ:
ในบทบาทก่อนหน้า ผมได้ปรับแต่งสคริปต์ประมวลผลข้อมูลที่ใช้ลูปซ้อนกันหลายรอบบนอาร์เรย์ ด้วยการใช้การแบ่งอาร์เรย์และการดำเนินการแบบเวกเตอร์ในตัว ผมจึงลดเวลาดำเนินการลงได้เกือบ 60 เปอร์เซ็นต์ ซึ่งช่วยปรับปรุงการตอบสนองของระบบได้อย่างมาก
6) คุณจะจัดการกับข้อผิดพลาดดัชนีอาร์เรย์นอกขอบเขตอย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังตรวจสอบความเข้าใจของคุณเกี่ยวกับการจัดการข้อผิดพลาดและแนวทางปฏิบัติในการเขียนโค้ดอย่างปลอดภัย
ตัวอย่างคำตอบ:
“ผมจะตรวจสอบให้แน่ใจว่าการเข้าถึงดัชนีทั้งหมดได้รับการตรวจสอบความถูกต้องก่อนใช้งาน โดยการตรวจสอบว่าการเข้าถึงนั้นอยู่ในช่วงความยาวของอาร์เรย์หรือไม่ นอกจากนี้ ผมจะใช้กลไก try-catch หรือวิธีการจัดการข้อผิดพลาดที่เทียบเท่ากัน เพื่อจัดการข้อผิดพลาดนอกขอบเขตที่ไม่คาดคิดได้อย่างราบรื่น”
7) คุณจะย้อนกลับอาร์เรย์โดยไม่ใช้หน่วยความจำเพิ่มเติมได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินประสิทธิภาพอัลกอริทึมของคุณและความเข้าใจเกี่ยวกับการดำเนินการในสถานที่
ตัวอย่างคำตอบ:
“ฉันจะใช้ตัวชี้สองตัว ตัวหนึ่งเริ่มจากต้นอาร์เรย์ และอีกตัวเริ่มจากท้ายอาร์เรย์ โดยการสลับตำแหน่ง”ping เมื่อนำองค์ประกอบที่ตำแหน่งเหล่านี้และย้ายตัวชี้ทั้งสองไปทางศูนย์กลางแล้ว จะสามารถกลับลำดับอาร์เรย์ในตำแหน่งเดิมได้ด้วยความซับซ้อนของเวลา O(n) และความซับซ้อนของพื้นที่ O(1)”
8) อธิบายสถานการณ์ที่คุณต้องจัดการชุดข้อมูลอาร์เรย์ขนาดใหญ่ คุณรับประกันประสิทธิภาพและความถูกต้องได้อย่างไร
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความสามารถของคุณในการจัดการข้อมูลในโลกแห่งความเป็นจริงและการเพิ่มประสิทธิภาพการทำงาน
ตัวอย่างคำตอบ:
ในงานก่อนหน้านี้ ผมทำงานกับอาร์เรย์ตัวเลขขนาดใหญ่เพื่อวิเคราะห์ข้อมูลทางการเงิน เพื่อรักษาประสิทธิภาพ ผมใช้เทคนิคการจัดการหน่วยความจำที่มีประสิทธิภาพและการประมวลผลแบบแบตช์ นอกจากนี้ ผมยังใช้ประโยชน์จากอาร์เรย์ NumPy เพื่อดำเนินการแบบเวกเตอร์ ซึ่งช่วยเพิ่มทั้งความแม่นยำและความเร็วในการประมวลผล
9) คุณจะดำเนินการอย่างไรเพื่อค้นหาค่าที่เจาะจงในอาร์เรย์ที่เรียงลำดับแล้ว?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์คาดหวังให้คุณแสดงความรู้เกี่ยวกับอัลกอริทึมการค้นหา
ตัวอย่างคำตอบ:
สำหรับอาร์เรย์แบบเรียงลำดับ ผมจะใช้อัลกอริทึมการค้นหาแบบไบนารี ซึ่งแบ่งช่วงเวลาการค้นหาออกเป็นสองส่วนซ้ำๆ วิธีนี้ช่วยลดความซับซ้อนของเวลาลงเหลือ O(log n) ทำให้มีประสิทธิภาพมากกว่าการค้นหาแบบเชิงเส้นสำหรับชุดข้อมูลขนาดใหญ่
10) อาร์เรย์มีบทบาทอย่างไรในการแก้ไขปัญหาในโลกแห่งความเป็นจริงในการพัฒนาซอฟต์แวร์?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการทำความเข้าใจว่าคุณเชื่อมโยงความรู้ด้านเทคนิคกับการใช้งานจริงได้อย่างไร
ตัวอย่างคำตอบ:
อาร์เรย์เป็นพื้นฐานสำคัญในการพัฒนาซอฟต์แวร์ เพราะช่วยสนับสนุนการจัดเก็บและดึงข้อมูลอย่างมีประสิทธิภาพ ยกตัวอย่างเช่น ในบทบาทที่ผ่านมา ผมใช้อาร์เรย์เพื่อนำกลไกการแคชและการเรียงลำดับข้อมูลมาใช้กับแดชบอร์ดการวิเคราะห์ ซึ่งช่วยให้เข้าถึงข้อมูลได้ง่ายขึ้นและลดเวลาในการตอบสนองของคิวรีลง
