0Pricing
Coding Interview Prep · บทเรียน

ชีตสรุปการจดจำรูปแบบ

จับคู่สัญญาณปัญหาทั่วไป 15 แบบ เช่น อาร์เรย์เรียงลำดับ ต้องการชุดผสมทั้งหมด และการเพิ่มค่าสูงสุดภายใต้ข้อจำกัด เข้ากับรูปแบบอัลกอริทึมที่แก้ได้เร็วที่สุด

ชีตสรุปการจดจำรูปแบบ เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

เกมรู้จำรูปแบบภายใน 60 วินาที

ในการสัมภาษณ์จริง คุณมีเวลาประมาณ 60 วินาทีหลังจากอ่านโจทย์ เพื่อระบุว่าควรใช้รูปแบบอัลกอริทึมใด ก่อนที่ผู้สัมภาษณ์จะคาดหวังให้คุณเริ่มเขียนโค้ด นี่คือทักษะสำคัญที่สุดที่ควรพัฒนา ไม่ใช่การท่องจำวิธีนำไปใช้ แต่เป็นการจดจำว่าควรเลือกใช้เครื่องมือใด

การรู้จำรูปแบบเกิดจากการจับคู่ สัญญาณของโจทย์ (คำและข้อจำกัดในคำอธิบายโจทย์) กับตระกูลอัลกอริทึมที่รู้จัก เมื่อคุณระบุรูปแบบได้แล้ว การนำไปใช้ก็จะกลายเป็นการเติมรายละเอียดลงในแม่แบบ บทเรียนนี้เป็นเอกสารสรุปอย่างเป็นระบบของสัญญาณโจทย์ที่พบบ่อยที่สุด 15 แบบและรูปแบบที่สอดคล้องกัน

# The recognition process
recognition_steps = [
    '1. Read the problem once fully (do not start coding)',
    '2. Identify the data structure: array, string, tree, graph, matrix?',
    '3. Identify the ask: find min/max, count ways, enumerate, detect cycle...?',
    '4. Note the constraint: n<=20 (bitmask), sorted (binary search), DAG (topo sort)?',
    '5. Map signal -> pattern',
    '6. State the pattern and complexity to the interviewer before coding',
    '7. Handle edge cases mentally before writing',
]
for step in recognition_steps:
    print(step)

สัญญาณที่ 1–3: รูปแบบอาร์เรย์และสตริง

สัญญาณโจทย์ที่พบบ่อยที่สุดสำหรับอาร์เรย์และสตริงมีดังนี้:

  • อาร์เรย์เรียงลำดับแล้ว + ค้นหาเป้าหมาย → การค้นหาแบบทวิภาค O(log n)
  • ค้นหาคู่หรือสามตัวที่มีผลรวมเท่ากับเป้าหมาย → ตัวชี้สองตัว O(n) หากเรียงลำดับแล้ว หรือตารางแฮช O(n) หากยังไม่เรียงลำดับ
  • อาร์เรย์ย่อยหรือสตริงย่อยที่ยาวหรือสั้นที่สุดและเป็นไปตามเงื่อนไข → หน้าต่างเลื่อน O(n)
  • ผลรวมสูงสุดหรือต่ำสุดของอาร์เรย์ย่อยที่ต่อเนื่องกัน → อัลกอริทึมของ Kadane O(n)
  • การตรวจหาค่าซ้ำ → เซตแฮช O(n) หรือ sort O(n log n)

หากอาร์เรย์เรียงลำดับแล้ว ให้พิจารณาการค้นหาแบบทวิภาคก่อนเสมอ อาร์เรย์ที่ไม่เรียงลำดับ + ผลรวมเป้าหมาย + O(n) = เกือบจะต้องใช้ตารางแฮชเพื่อค้นหาค่าที่เติมให้ครบผลรวม

# Quick recognition: array/string signals
signals = [
    ('Sorted array, find element',           'Binary search O(log n)'),
    ('Find two elements summing to K',        'Sort+two-ptr O(n log n) or hash O(n)'),
    ('Longest subarray with property P',      'Sliding window (variable size) O(n)'),
    ('Max sum contiguous subarray',           'Kadane algorithm O(n)'),
    ('Anagram/permutation check',             'Frequency map (Counter) O(n)'),
    ('Contains duplicate',                    'Hash set O(n)'),
    ('Merge two sorted arrays/lists',         'Two pointers O(n+m)'),
    ('Rotate / shift array',                  'Reverse trick O(n) in-place'),
    ('Next permutation',                      'Find rightmost ascent + swap + reverse'),
    ('Maximum product subarray',              'Track max and min (handles negatives)'),
]
for signal, pattern in signals:
    print(f'{signal:45s} => {pattern}')

สัญญาณที่ 4–6: รูปแบบต้นไม้และกราฟ

สัญญาณโจทย์เกี่ยวกับต้นไม้และกราฟ รวมถึงรูปแบบที่สอดคล้องกัน:

  • ท่องไปทีละระดับ / เส้นทางสั้นที่สุดในกราฟที่ไม่มีน้ำหนัก → BFS ด้วยคิวสองด้าน O(V+E)
  • สำรวจทุกเส้นทาง / ตรวจหาวงจร / ลำดับจาก DFS → DFS แบบเรียกซ้ำหรือวนซ้ำ O(V+E)
  • BST + คุณสมบัติของลำดับแบบเรียงลำดับกลาง (สมาชิกที่ k, ลำดับเรียงแล้ว) → DFS แบบเรียงลำดับกลาง O(n)
  • บรรพบุรุษร่วมที่ใกล้ที่สุด → การไล่ลงแบบเรียกซ้ำพร้อมติดตามเส้นทาง O(n)
  • องค์ประกอบที่เชื่อมต่อกัน / รวมสองกลุ่มเข้าด้วยกัน → DSU O(n × alpha(n))
# Tree/graph signal recognition
tree_graph_signals = [
    ('Level-order / minimum depth / word ladder',    'BFS with deque'),
    ('All paths / path sum / all permutations tree',  'DFS recursive'),
    ('Cycle detection (undirected)',                  'DFS with parent / DSU'),
    ('Cycle detection (directed) / course schedule', 'DFS three-color / Kahn topo sort'),
    ('Shortest path weighted graph',                  'Dijkstra (non-neg) / Bellman-Ford (neg)'),
    ('All-pairs shortest path',                       'Floyd-Warshall O(V^3)'),
    ('Topological order',                             'Kahn BFS topo sort'),
    ('Min spanning tree',                             'Kruskal (DSU) / Prim (heap)'),
    ('Dynamic connectivity / union-find',             'DSU path compression + union by rank'),
    ('Autocomplete / prefix search',                  'Trie'),
    ('BST kth smallest / range sum',                  'In-order DFS'),
]
for signal, pattern in tree_graph_signals:
    print(f'{signal:50s} => {pattern}')

สัญญาณที่ 7–9: สัญญาณของการเขียนโปรแกรมเชิงพลวัต

สัญญาณของ DP เป็นสิ่งที่จดจำได้ยากที่สุด ให้มองหาคำสำคัญเหล่านี้:

  • 'มีวิธี...กี่วิธี' → DP แบบนับจำนวน (บวกจำนวนจากปัญหาย่อย)
  • 'ต้นทุนต่ำสุดหรือสูงสุดในการบรรลุ...' → DP แบบหาค่าที่เหมาะที่สุด (เลือกค่าต่ำสุดหรือสูงสุดจากปัญหาย่อย)
  • 'เราสามารถบรรลุ...ได้หรือไม่' (ความเป็นไปได้) → DP แบบบูลีน (OR ของปัญหาย่อย)
  • ปัญหาย่อยที่กำหนดด้วยดัชนีสองตัวของสตริง → DP สองมิติ (LCS, ระยะห่างการแก้ไข)
  • เลือกหรือข้ามรายการภายใต้ข้อจำกัดด้านความจุ → DP แบบกระเป๋า
  • โครงสร้างย่อยที่เหมาะที่สุด + ปัญหาย่อยที่ซ้อนทับกัน → ตรวจสอบต้นไม้การเรียกซ้ำเพื่อหาการเรียกซ้ำ → DP
# DP signal recognition
dp_signals = [
    ('Number of ways to climb stairs / decode string',  '1D DP (Fibonacci-like)'),
    ('Minimum cost to reach end / coin change',          '1D DP (greedy fails)'),
    ('Longest increasing subsequence',                   '1D DP O(n^2) or patience sort O(n log n)'),
    ('Longest common subsequence of two strings',        '2D DP O(mn)'),
    ('Edit distance between two strings',                '2D DP O(mn) (LCS variant)'),
    ('Partition array into two equal subsets',           '0/1 knapsack boolean DP'),
    ('Fill knapsack with max value under weight limit',  '0/1 knapsack optimisation DP'),
    ('Burst balloons / matrix chain multiplication',     'Interval DP'),
    ('Palindrome partitioning minimum cuts',             'Interval DP + prefix palindrome'),
    ('Rob houses in circle',                             '1D DP × 2 (linear sub-problems)'),
]
for signal, pattern in dp_signals:
    print(f'{signal:55s} => {pattern}')

สัญญาณที่ 10–12: สัญญาณของฮีป สแตก และอัลกอริทึมแบบโลภ

สัญญาณสำหรับโจทย์ที่ใช้ฮีป สแตกแบบโมโนโทน และอัลกอริทึมแบบโลภ:

  • สมาชิกอันดับต้น ๆ K รายการ / สมาชิกที่มีค่ามากหรือน้อยเป็นอันดับที่ k → ฮีป (ฮีปต่ำสุดสำหรับสมาชิกที่มีค่ามากที่สุด K รายการ และฮีปสูงสุดสำหรับสมาชิกที่มีค่าน้อยที่สุดเป็นอันดับที่ k) O(n log k)
  • มัธยฐานจากข้อมูลที่ไหลเข้ามา → ฮีปสองชุด (ฮีปสูงสุดของครึ่งล่าง + ฮีปต่ำสุดของครึ่งบน)
  • สมาชิกถัดไปที่มีค่ามากกว่าหรือน้อยกว่า → สแตกแบบโมโนโทน O(n)
  • สี่เหลี่ยมผืนผ้าที่มีพื้นที่มากที่สุด / การกักเก็บน้ำ → สแตกแบบโมโนโทน O(n)
  • การจัดตารางช่วงเวลา / ทำให้จำนวนช่วงเวลาที่ไม่ทับซ้อนกันมากที่สุด → อัลกอริทึมแบบโลภ (เรียงตามเวลาสิ้นสุด)
# Heap / stack / greedy signals
heap_stack_greedy = [
    ('Top-K frequent elements',               'Min-heap size K: O(n log k)'),
    ('Kth largest in array',                   'Max-heap pop K times: O(n + k log n)'),
    ('Streaming median',                       'Two heaps (max + min): O(log n) per insert'),
    ('Merge K sorted lists',                   'Min-heap of (val, list_idx): O(n log k)'),
    ('Next greater element',                   'Monotonic decreasing stack: O(n)'),
    ('Largest rectangle in histogram',         'Monotonic increasing stack: O(n)'),
    ('Sliding window maximum',                 'Monotonic decreasing deque: O(n)'),
    ('Trapping rain water',                    'Two pointers OR monotonic stack: O(n)'),
    ('Jump game reachability / minimum jumps', 'Greedy range expansion: O(n)'),
    ('Merge overlapping intervals',            'Sort by start, linear scan: O(n log n)'),
    ('Gas station circular',                   'Greedy: start from reset point: O(n)'),
    ('Task scheduler with cooldown',           'Greedy: sort by frequency: O(n log n)'),
]
for signal, pattern in heap_stack_greedy:
    print(f'{signal:45s} => {pattern}')

สัญญาณที่ 13–15: การย้อนรอยและการจัดการบิต

สัญญาณสำหรับการย้อนรอยและการจัดการบิต:

  • สร้างเซตย่อย / การเรียงสับเปลี่ยน / การจัดหมู่ทั้งหมด → การย้อนรอย O(2^n หรือ n!)
  • การทำให้เป็นไปตามข้อจำกัด (ราชินี n ตัว, ซูโดกุ) → การย้อนรอยพร้อมตัดกิ่ง
  • ค้นหาสมาชิกที่หายไปหนึ่งรายการ / สมาชิกที่ไม่ซ้ำ → XOR O(n) ใช้พื้นที่ O(1)
  • แจกแจงเซตย่อยทั้งหมดของเซตขนาดเล็ก (n ≤ 20) → การแจกแจงด้วยบิตมาสก์ 2^n
  • นับบิตที่เป็น 1 / ตรวจสอบว่าเป็นกำลังของสอง → เทคนิคบิต (n & (n-1))
  • DP แบบบีบอัดสถานะด้วยเซตขนาดเล็ก → DP แบบบิตมาสก์ O(2^n × n)
# Backtracking and bit signals
bt_bit_signals = [
    ('Generate all subsets of array',              'Backtracking O(n * 2^n) / bitmask'),
    ('Generate all permutations',                  'Backtracking O(n * n!)'),
    ('Combination sum with target',                'Backtracking with pruning'),
    ('Word search in grid',                        'Backtracking DFS on grid O(m*n*4^L)'),
    ('N-queens placement',                         'Backtracking with column/diag sets'),
    ('Find single unique element (all others x2)', 'XOR all: O(n) O(1)'),
    ('Missing number in 0..n',                     'XOR or sum formula: O(n) O(1)'),
    ('Count set bits in n',                        'n &= n-1 loop or DP O(n)'),
    ('Check power of two',                         'n > 0 and n & (n-1) == 0'),
    ('Travelling salesman (n<=20)',                'Bitmask DP O(2^n * n^2)'),
    ('Number with max XOR in array',               'Trie on binary representation'),
]
for signal, pattern in bt_bit_signals:
    print(f'{signal:50s} => {pattern}')

การวิเคราะห์ข้อจำกัด: N บอกอะไรคุณ

ข้อจำกัดด้านขนาดข้อมูลเข้า n บอกความซับซ้อนด้านเวลาที่ยอมรับได้โดยตรง และจึงบอกตระกูลอัลกอริทึมที่ควรใช้ด้วย:

  • n ≤ 20: ยอมรับ O(2^n) หรือ O(n!) ได้ — DP แบบบิตมาสก์, การย้อนรอย
  • n ≤ 500: ยอมรับ O(n³) ได้ — อัลกอริทึมฟลอยด์–วอร์แชลล์, DP แบบลองทุกกรณี
  • n ≤ 5000: ยอมรับ O(n²) ได้ — DP แบบพื้นฐาน, การเรียงข้อมูลแบบกำลังสอง
  • n ≤ 10^6: ต้องใช้ O(n log n) — การเรียงแบบผสาน, ฮีป, การค้นหาแบบทวิภาค
  • n ≤ 10^8: ต้องใช้ O(n) — ตัวชี้สองตัว, หน้าต่างเลื่อน, DP เชิงเส้น

การวิเคราะห์ข้อจำกัดนี้ควรเป็นขั้นตอนแรกหลังจากอ่านโจทย์ ก่อนตัดสินใจเลือกอัลกอริทึมใด ๆ

# Constraint -> acceptable complexity -> algorithm family
complexity_map = [
    ('n <= 20',      'O(2^n) or O(n!)',  'Bitmask DP, backtracking/permutations'),
    ('n <= 500',     'O(n^3)',            'Floyd-Warshall, cubic DP, brute force'),
    ('n <= 5000',    'O(n^2)',            'Quadratic DP, bubble/insertion sort'),
    ('n <= 100000',  'O(n log n)',         'Merge sort, heap, binary search, topo sort'),
    ('n <= 1000000', 'O(n)',              'Linear DP, two pointers, sliding window, hash'),
    ('n <= 10^8',    'O(n) tight',        'Only simplest O(n) — no large constants'),
    ('n <= 10^18',   'O(log n) or O(1)', 'Math / number theory, binary search on answer'),
]
print(f'{'Constraint':15s} {'Complexity':15s} {'Algorithm Family'}')
print('-'*70)
for constraint, complexity, algorithms in complexity_map:
    print(f'{constraint:15s} {complexity:15s} {algorithms}')

โจทย์ → รูปแบบ: แบบฝึกหัดตอบเร็ว

ฝึกจับคู่นี้จนทำได้โดยอัตโนมัติ อ่านคำอธิบายโจทย์แต่ละข้อแล้วระบุรูปแบบ ก่อนดูวิธีแก้ ความเร็วสำคัญมาก — ในการสัมภาษณ์ คุณควรระบุรูปแบบได้ภายใน 60 วินาที:

  1. 'กำหนดอาร์เรย์ที่เรียงลำดับแล้ว จงตรวจสอบว่ามีสมาชิกสองตัวใด ๆ ที่มีผลรวมเท่ากับ K หรือไม่'
  2. 'กำหนดต้นไม้ จงหาเส้นผ่านศูนย์กลาง (เส้นทางที่ยาวที่สุดระหว่างโหนดสองโหนดใด ๆ)'
  3. 'กำหนดงาน n งานที่มีช่วงพัก k จงหาจำนวนช่วงเวลาการทำงาน CPU ต่ำสุด'
  4. 'กำหนดสตริง จงหาสตริงย่อยพาลินโดรมที่ยาวที่สุด'
  5. 'กำหนดตัวเลข 1..n ที่ขาดหายไปหนึ่งตัว จงหาตัวเลขที่หายไป'
# Quick-fire pattern recognition answers
problems = [
    ('Sorted array: two elements sum to K',
     'Two pointers (left from start, right from end): O(n)'),
    ('Tree diameter (longest path)',
     'DFS returning (height, max_diameter) pair: O(n)'),
    ('Task scheduler with cooldown k',
     'Greedy: (max_freq - 1)*(k+1) + count_of_max_freq: O(n log n)'),
    ('Longest palindromic substring',
     'Expand around centre OR Manacher: O(n^2) or O(n)'),
    ('Missing number in 1..n',
     'XOR all indices and values: O(n) O(1)'),
    ('Number of islands in binary grid',
     'BFS/DFS flood fill counting connected components: O(m*n)'),
    ('Decode string like 3[a2[bc]] -> aaabcbcaabcbc',
     'Stack to handle nested brackets: O(n)'),
    ('Valid parentheses [(){[]}]',
     'Stack push open, pop+match on close: O(n)'),
]
for problem, solution in problems:
    print(f'Q: {problem}\nA: {solution}\n')

สัญญาณเตือน: เมื่อรูปแบบของคุณใช้ไม่ได้ผล

แม้แต่วิศวกรที่มีประสบการณ์ก็อาจเลือกรูปแบบผิดในตอนแรก จงสังเกตสัญญาณเหล่านี้ว่ากระบวนการปัจจุบันของคุณไม่ถูกต้อง แล้วเปลี่ยนแนวทาง:

  • วิธี O(n²) ของคุณผ่านการทดสอบขนาดเล็ก แต่ใช้เวลาเกินกำหนดกับข้อมูลเข้าขนาดใหญ่ → ต้องใช้ตารางแฮช การค้นหาแบบทวิภาค หรือโครงสร้างโมโนโทน
  • อัลกอริทึมแบบโลภของคุณล้มเหลวกับตัวอย่างโต้แย้ง → ลองใช้ DP
  • พื้นที่สถานะของ DP มีขนาดใหญ่เกินไป → มองหาการพิสูจน์แบบโลภ หรือนิยามสถานะที่ฉลาดกว่า
  • BFS ให้คำตอบผิด → ตรวจสอบว่าคุณต้องใช้ดิกสตรา (แบบมีน้ำหนัก) แทน BFS (แบบไม่มีน้ำหนัก) หรือไม่
  • คุณพบข้อผิดพลาดจากตัวชี้ว่าง → เพิ่มกรณีฐานและการตรวจสอบกรณีขอบก่อนนำไปใช้
# Red flags and recovery strategies
red_flags = [
    ('TLE on large n',               'Check complexity; switch from O(n^2) to O(n log n) or O(n)'),
    ('WA with greedy',               'Find a counter-example; switch to DP or prove exchange arg'),
    ('DP table huge',                'State compression (bitmask/rolling array) or different state'),
    ('BFS gives wrong shortest path', 'Check if edges have weights; use Dijkstra instead'),
    ('Stack overflow in recursion',  'Add memoisation or convert to iterative with explicit stack'),
    ('Off-by-one in binary search',  'Use half-open intervals [lo, hi); verify with 2-element test'),
    ('DSU wrong answer',             'Check 0-indexed vs 1-indexed; check union direction'),
    ('Backtracking TLE',             'Add pruning conditions; ensure undo step is correct'),
]
print('Pattern | Recovery')
print('-'*70)
for flag, recovery in red_flags:
    print(f'{flag:40s} => {recovery}')

การสื่อสารการรู้จำรูปแบบในการสัมภาษณ์

ในการสัมภาษณ์ การอธิบายการรู้จำรูปแบบออกมาเป็นคำพูดจะแสดงถึงความเชี่ยวชาญ และเปิดโอกาสให้ผู้สัมภาษณ์ช่วยชี้แนะแนวทาง หากคุณกำลังเดินผิดทาง ใช้โครงสร้างสคริปต์นี้:

  1. 'ผมสังเกตว่าอาร์เรย์เรียงลำดับแล้ว ดังนั้นผมจึงคิดถึงการค้นหาแบบทวิภาค...'
  2. 'โจทย์ต้องการอาร์เรย์ย่อยที่มีค่าสูงสุด ซึ่งเป็นโจทย์คลาสสิกของอัลกอริทึม Kadane...'
  3. 'เราต้องการเซตย่อยที่เป็นไปได้ทั้งหมด ซึ่งบ่งชี้ว่าควรใช้การย้อนรอยร่วมกับต้นไม้การเรียกซ้ำ...'
  4. 'ข้อจำกัด n ≤ 20 บอกผมว่า 2^n = 1M เป็นค่าที่ยอมรับได้ ดังนั้น DP แบบบิตมาสก์จึงอาจใช้ได้...'

หลังจากระบุรูปแบบแล้ว ให้กล่าวถึงความซับซ้อนด้าน time และพื้นที่ก่อนเขียนโค้ดแม้แต่บรรทัดเดียว สิ่งนี้แสดงว่าคุณคำนึงถึงประสิทธิภาพก่อนการนำไปใช้

# Interview communication template
def communicate_approach(problem, pattern, time_complexity, space_complexity, edge_cases):
    print(f'Problem: {problem}')
    print(f'Pattern: {pattern}')
    print(f'Time: {time_complexity}, Space: {space_complexity}')
    print(f'Edge cases to handle: {", ".join(edge_cases)}')
    print()

# Example communications
communicate_approach(
    problem='Find longest substring without repeating characters',
    pattern='Sliding window with a set tracking current window characters',
    time_complexity='O(n)',
    space_complexity='O(min(n, alphabet_size))',
    edge_cases=['empty string', 'all same characters', 'all unique characters']
)

communicate_approach(
    problem='Given sorted matrix, find if target exists',
    pattern='Binary search or staircase search (top-right corner): eliminate row or column each step',
    time_complexity='O(m + n)',
    space_complexity='O(1)',
    edge_cases=['empty matrix', 'single element', 'target at corners']
)

การสร้างคลังคำศัพท์สำหรับการรู้จำรูปแบบ

วิธีที่เร็วที่สุดในการสร้างทักษะการรู้จำรูปแบบคือการแก้โจทย์เป็น ชุดตามหัวข้อ ไม่ใช่แก้แบบสุ่ม ใช้เวลาหนึ่งสัปดาห์กับโจทย์หน้าต่างเลื่อนเท่านั้น จากนั้นจึงไปทำโจทย์ตัวชี้สองตัว แล้วจึงทำโจทย์ DP การทำโจทย์ประเภทเดียวกัน 20 ข้อจะช่วยสร้างสัญชาตญาณให้จดจำรูปแบบนั้นได้ทันทีที่เห็น

หลังทำโจทย์แต่ละข้อ ให้เขียน 'บันทึกรูปแบบ' หนึ่งบรรทัด ได้แก่ สัญญาณของโจทย์และรูปแบบที่สัญญาณนั้นกระตุ้นให้คุณนึกถึง สร้างเอกสารสรุปของคุณเอง หลังจากแก้โจทย์ 200 ข้อเป็นชุดตามหัวข้อแล้ว คุณจะจำแนกโจทย์สัมภาษณ์ได้ประมาณ 90% ภายใน 30 วินาที ส่วนอีก 10% ที่เหลือต้องอาศัยการวิเคราะห์อย่างรอบคอบ แม้แต่สำหรับวิศวกรที่มีประสบการณ์

# Personal pattern note template
pattern_notes = [
    {'signal': 'sorted array + two sum',     'pattern': 'two pointers',          'example': 'LC 167 Two Sum II'},
    {'signal': 'longest X without repeating', 'pattern': 'sliding window + set',  'example': 'LC 3 Longest Substring'},
    {'signal': 'max sum subarray',            'pattern': 'Kadane',                'example': 'LC 53 Max Subarray'},
    {'signal': 'permutations/subsets',        'pattern': 'backtracking',          'example': 'LC 46 Permutations'},
    {'signal': 'tree path sum',               'pattern': 'DFS with accumulator', 'example': 'LC 112 Path Sum'},
    {'signal': 'course schedule',             'pattern': 'Kahn topo sort',        'example': 'LC 207 Course Schedule'},
    {'signal': 'top-K elements',              'pattern': 'min-heap size K',       'example': 'LC 215 Kth Largest'},
]
print(f'{'Signal':40s} {'Pattern':30s} {'Example'}')
print('-'*90)
for note in pattern_notes:
    print(f'{note["signal"]:40s} {note["pattern"]:30s} {note["example"]}')

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดโครงสร้างข้อมูลและอัลกอริทึม — การเตรียมตัวสัมภาษณ์การเขียนโปรแกรมจากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า การรู้จำรูปแบบจับคู่สัญญาณของโจทย์กับตระกูลอัลกอริทึม — อาร์เรย์ที่เรียงลำดับแล้วบ่งชี้การค้นหาแบบทวิภาค 'เซตย่อยทั้งหมด' บ่งชี้การย้อนรอย และ 'ต้นทุนต่ำสุด' บ่งชี้ DP รวมถึง ข้อจำกัด n บอกความซับซ้อนที่ยอมรับได้: n ≤ 20 ใช้ O(2^n) ได้ ส่วน n ≤ 10^6 ต้องใช้ O(n log n) หรือดีกว่า และ การอธิบายรูปแบบกับความซับซ้อนก่อนเขียนโค้ดแสดงถึงความเชี่ยวชาญและเปิดโอกาสให้ผู้สัมภาษณ์ให้ข้อเสนอแนะ บทถัดไป เราจะนำการรู้จำรูปแบบไปฝึกใช้กับโจทย์สัมภาษณ์จำลองแบบจับเวลาในระดับง่ายและปานกลาง

คำถามที่พบบ่อย

บทเรียน “ชีตสรุปการจดจำรูปแบบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ชีตสรุปการจดจำรูปแบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ชีตสรุปการจดจำรูปแบบ”

จับคู่สัญญาณปัญหาทั่วไป 15 แบบ เช่น อาร์เรย์เรียงลำดับ ต้องการชุดผสมทั้งหมด และการเพิ่มค่าสูงสุดภายใต้ข้อจำกัด เข้ากับรูปแบบอัลกอริทึมที่แก้ได้เร็วที่สุด คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ชีตสรุปการจดจำรูปแบบ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชีตสรุปการจดจำรูปแบบ
  2. การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง
  3. การรับมือกรณีขอบเขตและการสื่อสารของผู้เข้าสัมภาษณ์
  4. การอธิบายปัญหายาก: Word Ladder II และ Alien Dictionary
← กลับไปที่ Coding Interview Prep