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

การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง

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

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

วิธีใช้การสัมภาษณ์จำลองนี้

บทเรียนนี้จำลองเซสชันการสัมภาษณ์การเขียนโปรแกรมจริง สำหรับแต่ละโจทย์ คุณควรทำดังนี้: (1) อ่านหนึ่งครั้ง (2) ระบุรูปแบบภายใน 60 วินาที (3) บอกแนวทางและความซับซ้อนของคุณ (4) เขียนวิธีแก้ และ (5) ทดสอบด้วยตัวอย่าง ตั้งเวลาไว้ โจทย์ระดับง่ายควรใช้เวลา 10–15 นาที ส่วนโจทย์ระดับปานกลางควรใช้เวลา 20–25 นาที

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

# Mock interview timer simulation
import time

class InterviewTimer:
    def __init__(self, total_minutes):
        self.total = total_minutes * 60
        self.start = None

    def begin(self, problem_name):
        self.start = time.time()
        print(f'TIMER STARTED: {problem_name}')
        print(f'You have {self.total//60} minutes. Go!')

    def checkpoint(self, label):
        if self.start:
            elapsed = time.time() - self.start
            remaining = self.total - elapsed
            print(f'[{label}] Elapsed: {elapsed:.0f}s, Remaining: {remaining:.0f}s')

# Usage in real practice:
timer = InterviewTimer(15)  # 15-minute easy problem
timer.begin('Two Sum')
time.sleep(1)
timer.checkpoint('Identified pattern')

โจทย์ระดับง่าย 1: วงเล็บที่ถูกต้อง

โจทย์: กำหนดสตริงที่มีเฉพาะ '(', ')', '{', '}', '[', ']' จงตรวจสอบว่าสตริงข้อมูลเข้านั้นถูกต้องหรือไม่ สตริงจะถูกต้องก็ต่อเมื่อวงเล็บเปิดทุกตัวถูกปิดด้วยวงเล็บประเภทเดียวกันและอยู่ในลำดับที่ถูกต้อง

สัญญาณ: คู่ที่ต้องจับคู่กัน ลำดับมีความสำคัญ วงเล็บเปิดล่าสุดต้องถูกปิดก่อน → สแตก ใส่วงเล็บเปิดลงในสแตก แล้วเรียกใช้ pop และตรวจสอบเมื่อพบวงเล็บปิด หากสแตกว่างเมื่อพยายามเรียกใช้ pop หรือยังมีสมาชิกเหลืออยู่ตอนจบ สตริงนั้นไม่ถูกต้อง เวลา O(n), พื้นที่ O(n)

def is_valid(s):
    stack = []
    matching = {')': '(', '}': '{', ']': '['}

    for char in s:
        if char in '({[':
            stack.append(char)
        else:
            if not stack or stack[-1] != matching[char]:
                return False
            stack.pop()
    return len(stack) == 0

# Test cases
test_cases = [
    ('()', True),
    ('()[]{}'  , True),
    ('(]', False),
    ('([)]', False),
    ('{[]}', True),
    ('', True),        # empty string is valid
    ('(((', False),    # unmatched opens
    (')]', False),     # close without open
]
for s, expected in test_cases:
    result = is_valid(s)
    status = 'PASS' if result == expected else 'FAIL'
    print(f'{status}: is_valid({repr(s)}) = {result} (expected {expected})')

โจทย์ระดับง่าย 2: เวลาที่ดีที่สุดในการซื้อและขายหุ้น

โจทย์: กำหนดอาร์เรย์ prices โดยที่ prices[i] คือราคาหุ้นในวันที่ i จงหากำไรสูงสุดจากการซื้อหนึ่งครั้งและขายหนึ่งครั้ง (ต้องซื้อก่อนขาย) ให้คืนค่า 0 หากไม่สามารถทำกำไรได้

สัญญาณ: ผลต่างสูงสุดที่ตำแหน่งทางซ้ายต้องมาก่อนตำแหน่งทางขวา → ติดตามค่าต่ำสุดสะสมขณะสแกนจากซ้ายไปขวา ในแต่ละวัน กำไรที่อาจเกิดขึ้นคือ current_price - min_so_far จากนั้นอัปเดตกำไรสูงสุด วิธีนี้มีความซับซ้อน O(n)/O(1) และเป็นกรณีพิเศษของอัลกอริทึมของ Kadane

def max_profit(prices):
    if not prices:
        return 0
    min_price = float('inf')
    max_profit = 0

    for price in prices:
        if price < min_price:
            min_price = price
        elif price - min_price > max_profit:
            max_profit = price - min_price
    return max_profit

# Test cases
test_cases = [
    ([7, 1, 5, 3, 6, 4], 5),   # buy at 1, sell at 6
    ([7, 6, 4, 3, 1], 0),      # monotonically decreasing: no profit
    ([2, 4, 1], 2),             # buy at 2, sell at 4
    ([1], 0),                   # single price: no transaction possible
    ([3, 3, 3], 0),             # flat: no profit
]
for prices, expected in test_cases:
    result = max_profit(prices)
    status = 'PASS' if result == expected else 'FAIL'
    print(f'{status}: max_profit({prices}) = {result} (expected {expected})')

โจทย์ระดับปานกลาง 1: ผลรวมสามจำนวน

โจทย์: กำหนดอาร์เรย์ จงหาสามสมาชิกทุกชุดที่ไม่ซ้ำกันและมีผลรวมเท่ากับศูนย์ วิธีแก้ต้องไม่มีสามสมาชิกชุดที่ซ้ำกัน

รูปแบบ: ขยายตัวชี้สองตัวให้ทำงานกับสมาชิกสามตัว เรียงอาร์เรย์ด้วย sort สำหรับสมาชิกแต่ละตัว nums[i] ให้ใช้ตัวชี้สองตัว left = i+1, right = n-1 เพื่อค้นหาคู่ที่มีผลรวมเท่ากับ -nums[i] ข้ามค่าซ้ำโดยเลื่อนตัวชี้ผ่านค่าที่เหมือนกัน เวลา O(n²), พื้นที่ O(1) โดยไม่รวมข้อมูลผลลัพธ์ การทำ sort ช่วยให้จัดการค่าซ้ำได้อย่างเป็นระเบียบ

def three_sum(nums):
    nums.sort()
    result = []
    n = len(nums)

    for i in range(n - 2):
        # Skip duplicate values for the first element
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        left, right = i + 1, n - 1
        while left < right:
            total = nums[i] + nums[left] + nums[right]
            if total == 0:
                result.append([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left + 1]:
                    left += 1      # skip duplicate lefts
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1     # skip duplicate rights
                left += 1; right -= 1
            elif total < 0:
                left += 1
            else:
                right -= 1
    return result

print(three_sum([-1, 0, 1, 2, -1, -4]))  # [[-1,-1,2],[-1,0,1]]
print(three_sum([0, 0, 0, 0]))            # [[0,0,0]]
print(three_sum([]))                       # []
print(three_sum([1, 2, -2, -1]))           # []

โจทย์ระดับปานกลาง 2: สตริงย่อยที่ยาวที่สุดซึ่งไม่มีอักขระซ้ำ

โจทย์: กำหนดสตริงหนึ่งรายการ จงหาความยาวของสตริงย่อยที่ยาวที่สุดซึ่งไม่มีอักขระซ้ำ

รูปแบบ: ใช้หน้าต่างเลื่อนร่วมกับเซต (หรือพจนานุกรมตำแหน่งล่าสุด) โดยรักษาหน้าต่าง [ซ้าย, ขวา] ไว้ ขยายด้านขวาโดยเพิ่มอักขระแต่ละตัว หากอักขระซ้ำ (มีอยู่ในหน้าต่างแล้ว) ให้หดหน้าต่างจากด้านซ้ายจนกว่าจะลบอักขระซ้ำออก ติดตามขนาดหน้าต่างสูงสุดที่พบ ความซับซ้อนด้านเวลา O(n) และด้านพื้นที่ O(min(n, ขนาดชุดอักขระ))

def length_of_longest_substring(s):
    char_index = {}    # character -> last seen index
    left = 0
    max_len = 0

    for right, char in enumerate(s):
        if char in char_index and char_index[char] >= left:
            left = char_index[char] + 1  # shrink window past duplicate
        char_index[char] = right
        max_len = max(max_len, right - left + 1)
    return max_len

# Test cases
test_cases = [
    ('abcabcbb', 3),   # 'abc'
    ('bbbbb', 1),       # 'b'
    ('pwwkew', 3),      # 'wke'
    ('', 0),            # empty string
    ('au', 2),          # full string
    ('dvdf', 3),        # 'vdf' (skip the first d)
]
for s, expected in test_cases:
    result = length_of_longest_substring(s)
    status = 'PASS' if result == expected else 'FAIL'
    print(f'{status}: len_longest({repr(s)}) = {result} (expected {expected})')

โจทย์ระดับปานกลาง 3: ปัญหาการทอนเหรียญ

โจทย์: กำหนดชนิดของเหรียญและจำนวนเงินเป้าหมาย จงหาจำนวนเหรียญน้อยที่สุดที่ต้องใช้เพื่อให้ได้จำนวนเงินดังกล่าว หากไม่สามารถทำได้ ให้คืนค่า -1

รูปแบบ: ใช้ DP แบบหนึ่งมิติแบบคลาสสิก (รูปแบบหนึ่งของปัญหาเป้สะพายหลังที่ใช้รายการได้ไม่จำกัด) dp[i] = จำนวนเหรียญน้อยที่สุดสำหรับจำนวนเงิน i กำหนดค่าเริ่มต้นให้ dp[0] = 0 และค่าอื่นทั้งหมดเป็นอนันต์ สำหรับจำนวนเงินแต่ละค่าตั้งแต่ 1 ถึงเป้าหมาย ให้ลองใช้เหรียญทุกชนิด dp[i] = min(dp[i], dp[i - coin] + 1) สำหรับเหรียญที่ใช้ได้แต่ละชนิด ความซับซ้อนด้านเวลา O(จำนวนเงิน × จำนวนเหรียญ) และด้านพื้นที่ O(จำนวนเงิน)

def coin_change(coins, amount):
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0   # 0 coins to make amount 0

    for i in range(1, amount + 1):
        for coin in coins:
            if coin <= i and dp[i - coin] + 1 < dp[i]:
                dp[i] = dp[i - coin] + 1

    return dp[amount] if dp[amount] != float('inf') else -1

# Test cases
test_cases = [
    ([1, 5, 11], 15, 3),      # 11+1+1+1+1... wait: 11+1+1+1+1=5 coins? No: 5+5+5=3
    ([2], 3, -1),              # impossible (only even coins)
    ([1], 0, 0),               # 0 coins for amount 0
    ([1, 2, 5], 11, 3),        # 5+5+1
    ([186, 419, 83, 408], 6249, 20),  # stress test
]
for coins, amount, expected in test_cases:
    result = coin_change(coins, amount)
    status = 'PASS' if result == expected else 'FAIL'
    print(f'{status}: coin_change({coins}, {amount}) = {result} (expected {expected})')

กระบวนการแก้โจทย์ภายใต้ความกดดันด้านเวลา

เมื่อเวลาใกล้หมด ให้จัดลำดับความสำคัญดังนี้: (1) คำตอบแบบลองทุกกรณีที่ทำงานได้และให้ผลลัพธ์ถูกต้อง สำคัญกว่าคำตอบแบบเหมาะที่สุดที่ยังเขียนไม่เสร็จ (2) จัดการกรณีขอบให้เห็นอย่างชัดเจน (3) เขียนโค้ดที่สะอาดและอ่านง่าย แทนการใช้โค้ดบรรทัดเดียวที่ดูฉลาดแต่เข้าใจยาก ผู้สัมภาษณ์มักชอบคำตอบที่สะอาด มีความซับซ้อน O(n²) และผ่านกรณีทดสอบทั้งหมด มากกว่าคำตอบ O(n) ที่มีข้อผิดพลาดซึ่งสังเกตได้ยาก

หากคุณพบว่าคำตอบ O(n²) ของคุณไม่ถูกต้อง อย่าล้มเลิกกลางคัน — เขียนให้เสร็จ ทดสอบ แล้วจึงเสนอว่าจะปรับให้มีประสิทธิภาพขึ้นหากยังมีเวลาเหลือ คำตอบแบบเหมาะที่สุดที่เขียนค้างไว้ครึ่งหนึ่งย่อมได้คะแนนน้อยกว่าคำตอบที่เสร็จสมบูรณ์แต่ยังไม่เหมาะที่สุด

# Priority order when time runs out
priority = [
    ('First priority',  'Correct brute-force that passes all test cases'),
    ('Second priority', 'Optimal solution with bugs is WORSE than suboptimal correct'),
    ('Third priority',  'Edge cases handled visibly (empty input, single element, negatives)'),
    ('Fourth priority', 'Clean variable names and readable code'),
    ('Fifth priority',  'Add complexity statement as a comment at the top'),
]
print('Under time pressure, prioritise:')
for priority_level, desc in priority:
    print(f'  {priority_level}: {desc}')

# Adding complexity as a comment
def two_sum_commented(nums, target):
    # Time: O(n), Space: O(n)
    seen = {}
    for i, n in enumerate(nums):
        complement = target - n
        if complement in seen:
            return [seen[complement], i]
        seen[n] = i
    return []

การทบทวนคำตอบของคุณ: คำถามห้าข้อ

ก่อนจะพูดว่า “เสร็จแล้ว” ให้ถามตัวเองห้าข้อนี้:

  1. รองรับข้อมูลเข้าที่ว่างเปล่าหรือไม่ [], '', None, n=0
  2. รองรับกรณีที่มีสมาชิกเพียงหนึ่งรายการหรือไม่ อาร์เรย์ขนาด 1 ต้นไม้ที่มีโหนดเดียว
  3. รองรับกรณีที่สมาชิกเหมือนกันทั้งหมดหรือไม่ [5, 5, 5, 5], 'aaaa'
  4. รองรับค่าต่ำสุดและค่าสูงสุดหรือไม่ จำนวนติดลบ จำนวนเต็มที่มีค่ามากมาก และ 0
  5. ได้ระบุความซับซ้อนด้านเวลาและพื้นที่หรือไม่ ความซับซ้อนแบบบิก-โอพร้อมเหตุผลสั้น ๆ

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

# The five edge-case categories with examples
edge_cases = {
    'Empty input':     ['[] empty array', '"" empty string', 'None / null'],
    'Single element':  ['[42]', 'single node tree', 'n=1'],
    'All same':        ['[3,3,3,3]', '"aaaa"', 'uniform grid'],
    'Extreme values':  ['[-10^9, 10^9]', 'INT_MAX + 1 overflow check', '0 as input'],
    'Already sorted':  ['ascending + descending', 'already optimal input'],
}
for category, examples in edge_cases.items():
    print(f'{category}:')
    for ex in examples:
        print(f'  - {ex}')
    print()

# Template for self-testing:
def test_my_solution(fn, test_cases):
    for inputs, expected in test_cases:
        result = fn(*inputs) if isinstance(inputs, tuple) else fn(inputs)
        status = 'PASS' if result == expected else 'FAIL'
        print(f'{status}: {inputs} => {result} (expected {expected})')

การรับมือกับคำถามต่อยอด

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

  • “ทำให้ใช้พื้นที่ O(1) ได้หรือไม่” → มองหาการแก้ไขข้อมูลเข้าโดยตรงหรือเทคนิคทางคณิตศาสตร์
  • “ถ้า n มีขนาดใหญ่มากจะทำอย่างไร” → อภิปรายแนวทางการประมวลผลข้อมูลต่อเนื่อง การแบ่งหน้า หรือการสุ่มตัวอย่าง
  • “ถ้าอาร์เรย์เรียงลำดับอยู่แล้วจะทำอย่างไร” → มักมีอัลกอริทึมที่ง่ายกว่านี้
  • “ทำให้ประมวลผลแบบขนานได้หรือไม่” → ระบุปัญหาย่อยที่เป็นอิสระต่อกัน แล้วอภิปรายการใช้ MapReduce หรือการประมวลผลงานแบบขนาน

คำถามต่อยอดใช้ทดสอบความเข้าใจเชิงลึกและความสามารถในการปรับตัว ให้พูดว่า “ขอเวลาคิดสักครู่นะครับ/ค่ะ” แทนการเดาคำตอบทันที การหยุดคิดอย่างรอบคอบย่อมดีกว่าการตอบผิดด้วยความมั่นใจ

# Follow-up answers for classic problems
follow_ups = [
    {
        'problem': 'Find duplicate in array 1..n (space O(n) solution uses set)',
        'follow_up': 'Can you do it in O(1) space without modifying input?',
        'answer': 'Floyd cycle detection: treat array as linked list (slow/fast pointer)',
    },
    {
        'problem': 'Reverse a string (space O(n) with new array)',
        'follow_up': 'Can you do it in-place?',
        'answer': 'Two pointers from both ends, swap until they meet: O(n) time O(1) space',
    },
    {
        'problem': 'Find max in array: O(n) single pass',
        'follow_up': 'What if the array is streamed one element at a time?',
        'answer': 'Same algorithm works! Running maximum handles infinite streams',
    },
    {
        'problem': 'Merge sorted arrays O(n+m)',
        'follow_up': 'What if you have K sorted arrays?',
        'answer': 'Use a min-heap of (value, array_idx, element_idx): O(n log k)',
    },
]
for fu in follow_ups:
    print(f'Problem: {fu["problem"]}')
    print(f'Follow-up: {fu["follow_up"]}')
    print(f'Answer: {fu["answer"]}\n')

โจทย์ฝึกฝน: จัดกลุ่มแอนนาแกรม

โจทย์: กำหนดอาร์เรย์ของสตริง จงจัดกลุ่มแอนนาแกรมให้อยู่ด้วยกัน และคืนรายการของกลุ่มเหล่านั้น

รูปแบบ: ใช้แผนที่ความถี่เป็นคีย์ สำหรับสตริงแต่ละรายการ ให้ใช้ sort กับอักขระ (หรือคำนวณทูเพิลความถี่ของอักขระ) เพื่อสร้างคีย์มาตรฐาน จากนั้นจัดกลุ่มสตริงตามคีย์นี้โดยใช้แผนที่แฮชของรายการ ความซับซ้อนด้านเวลา O(n × m log m) โดย m คือความยาวสูงสุดของสตริง และด้านพื้นที่ O(n × m) ไม่จำเป็นต้องใช้วงวนซ้อนกัน — วนผ่านอาร์เรย์เพียงรอบเดียว

from collections import defaultdict

def group_anagrams(strs):
    # Method 1: sort each string as key
    groups = defaultdict(list)
    for s in strs:
        key = ''.join(sorted(s))   # canonical form
        groups[key].append(s)
    return list(groups.values())

def group_anagrams_v2(strs):
    # Method 2: character count tuple as key (avoids sorting)
    groups = defaultdict(list)
    for s in strs:
        count = [0] * 26
        for c in s:
            count[ord(c) - ord('a')] += 1
        key = tuple(count)   # immutable, hashable
        groups[key].append(s)
    return list(groups.values())

test = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
result = [sorted(g) for g in group_anagrams(test)]
result.sort()
print('Groups:', result)
# [['ate','eat','tea'], ['bat'], ['nat','tan']]

print('V2:', [sorted(g) for g in sorted(group_anagrams_v2(test), key=len)])

การประเมินตนเองหลังการจำลองสัมภาษณ์

หลังการจำลองสัมภาษณ์แต่ละครั้ง ให้ประเมินตนเองในด้านต่อไปนี้:

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

ให้คะแนนตนเอง 1-5 ในแต่ละด้าน มุ่งฝึกฝนในสัปดาห์ถัดไปกับด้านที่ได้คะแนนต่ำที่สุด ผู้สมัครส่วนใหญ่จำเป็นต้องพัฒนาทักษะการระบุรูปแบบหรือการสื่อสาร โดยแทบไม่ต้องพัฒนาทั้งสองด้านพร้อมกัน

# Self-assessment scoring template
def self_assess(pattern_speed, code_correctness, edge_cases,
                communication, complexity, recovery):
    scores = {
        'Pattern recognition (< 60s)': pattern_speed,
        'Code correctness (all tests pass)': code_correctness,
        'Edge case handling': edge_cases,
        'Communication (thinking aloud)': communication,
        'Complexity stated correctly': complexity,
        'Recovery when stuck': recovery,
    }
    total = sum(scores.values())
    max_total = len(scores) * 5
    print('Self-Assessment Results:')
    print('-'*50)
    for dim, score in scores.items():
        bar = '#' * score + '-' * (5 - score)
        print(f'{dim:45s} [{bar}] {score}/5')
    print(f'\nTotal: {total}/{max_total} ({total/max_total*100:.0f}%)')
    weak = min(scores, key=scores.get)
    print(f'Focus area: {weak}')

self_assess(4, 3, 4, 3, 5, 2)  # example scores

การตรวจสอบอย่างรวดเร็ว

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

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

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

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

บทเรียน “การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง”

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

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

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

บทเรียน “การสัมภาษณ์จำลองจับเวลา: ปัญหาระดับง่ายและปานกลาง” ใช้เวลานานแค่ไหน

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

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

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

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

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