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

การรวมบัญชีและองค์ประกอบเชื่อมโยง

จัดกลุ่มบัญชีที่ใช้อีเมลร่วมกันโดยถือว่าอีเมลเป็นโหนดของ DSU จากนั้นรวบรวมอีเมลทั้งหมดในแต่ละองค์ประกอบเพื่อสร้างบัญชีที่รวมแล้วกลับคืน

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

ปัญหา: การผสานบัญชี

ปัญหา การผสานบัญชี (LeetCode 721) ให้รายการบัญชี โดยแต่ละบัญชีเป็นรายการสตริงที่สมาชิกตัวแรกคือชื่อบัญชี และสมาชิกที่เหลือคือที่อยู่อีเมล บัญชีสองบัญชีเป็นของบุคคลเดียวกันหากมีอีเมลร่วมกันอย่างน้อยหนึ่งรายการ ให้ผสานบัญชีทั้งหมดที่เป็นของบุคคลเดียวกันและส่งคืนรายการอีเมลที่เรียงลำดับแล้ว

โดยพื้นฐานแล้ว นี่คือปัญหา องค์ประกอบที่เชื่อมต่อกัน ซึ่งมีอีเมลเป็นโหนด และบัญชีที่ใช้อีเมลร่วมกันจะเชื่อมโหนดเหล่านั้นเข้าด้วยกัน DSU จึงเป็นเครื่องมือที่เหมาะสมที่สุด: ทำ union อีเมลทั้งหมดภายในบัญชีเดียวกัน แล้วรวบรวมอีเมลตามองค์ประกอบ

# Example input
accounts = [
    ['John', 'john@mail.com', 'john1@mail.com'],
    ['John', 'john2@mail.com'],
    ['Mary', 'mary@mail.com'],
    ['John', 'john1@mail.com', 'john2@mail.com'],
]
# john@mail.com and john1@mail.com are in account[0]
# john1@mail.com and john2@mail.com are in account[3]
# => john@, john1@, john2@ are all the same person
# Expected output:
# ['John', 'john1@mail.com', 'john2@mail.com', 'john@mail.com']
# ['Mary', 'mary@mail.com']
print('Goal: merge accounts sharing any email into one account')

การจับคู่อีเมลกับ ID จำนวนเต็ม

DSU ทำงานกับดัชนีจำนวนเต็ม แต่โหนดของเราคือสตริงอีเมล เราจึงต้อง จับคู่อีเมลแต่ละรายการกับ ID จำนวนเต็ม และต้องจำด้วยว่าอีเมลแต่ละรายการเป็นของชื่อใด ใช้พจนานุกรม email_to_id เพื่อกำหนด ID ที่เพิ่มขึ้นทีละหนึ่ง และใช้ email_to_name เพื่อติดตามชื่อบัญชีที่เชื่อมโยงกับอีเมลแต่ละรายการ

อีเมลที่ไม่ซ้ำกันแต่ละรายการจะได้รับ ID หนึ่งรายการ หากอีเมลเดียวกันปรากฏในหลายบัญชี อีเมลนั้นจะจับคู่กับ ID เดียวกัน — และการ union ID ของอีเมลภายในบัญชีเดียวกันจะเชื่อมอีเมลเหล่านั้นให้เป็นองค์ประกอบเดียว ชื่อที่เชื่อมโยงกับ ID ของอีเมลที่เป็นรากจะกลายเป็นชื่อบัญชีที่ผสานแล้ว

accounts = [
    ['John', 'john@mail.com', 'john1@mail.com'],
    ['John', 'john2@mail.com'],
    ['Mary', 'mary@mail.com'],
    ['John', 'john1@mail.com', 'john2@mail.com'],
]

email_to_id = {}
email_to_name = {}
next_id = [0]

for account in accounts:
    name = account[0]
    for email in account[1:]:
        if email not in email_to_id:
            email_to_id[email] = next_id[0]
            next_id[0] += 1
        email_to_name[email] = name

print('Total unique emails:', len(email_to_id))
for email, eid in email_to_id.items():
    print(f'  {email} => id {eid} (owner: {email_to_name[email]})')

การ union อีเมลภายในแต่ละบัญชี

สำหรับแต่ละบัญชี เราจะ union ID ของอีเมลทั้งหมดที่ระบุไว้ด้วยกัน เราเลือก อีเมลรายการแรก ในบัญชีเป็นตัวแทน แล้ว union ID ของอีเมลที่เหลือทุกตัวเข้ากับ ID นั้น วิธีนี้จะเชื่อมอีเมลทั้งหมดในบัญชีให้เป็นองค์ประกอบเดียว

หลังจากประมวลผลทุกบัญชีแล้ว อีเมลที่เคยปรากฏร่วมกัน (โดยตรงหรือผ่านการเชื่อมต่อแบบส่งต่อระหว่างบัญชี) จะมีราก DSU เดียวกันทั้งหมด นี่คือขั้นตอนสำคัญที่ส่งต่อการเชื่อมต่อข้ามบัญชีหลายบัญชี

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    def union(self, x, y):
        self.parent[self.find(x)] = self.find(y)

# After building email_to_id (from previous step)
# email_to_id = {'john@mail.com':0, 'john1@mail.com':1,
#                'john2@mail.com':2, 'mary@mail.com':3}

dsu = DSU(5)  # 4 unique emails

# For account ['John', 'john@mail.com', 'john1@mail.com']:
dsu.union(0, 1)    # john@ and john1@ share account => same component

# For account ['John', 'john1@mail.com', 'john2@mail.com']:
dsu.union(1, 2)    # john1@ and john2@ share account => same component

# Now 0,1,2 all share a root; 3 (mary) is separate
print('find(0)==find(2)?', dsu.find(0) == dsu.find(2))  # True
print('find(0)==find(3)?', dsu.find(0) == dsu.find(3))  # False

การรวบรวมอีเมลตามองค์ประกอบ

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

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

from collections import defaultdict

# After DSU unions, group by root
def collect_components(email_to_id, email_to_name, dsu):
    root_to_emails = defaultdict(list)
    for email, eid in email_to_id.items():
        root = dsu.find(eid)
        root_to_emails[root].append(email)

    result = []
    for root, emails in root_to_emails.items():
        # Find the name from any email in this group
        name = email_to_name[emails[0]]
        result.append([name] + sorted(emails))
    return result

# Mock data for illustration
email_to_id = {'john@m.com':0,'john1@m.com':1,'john2@m.com':2,'mary@m.com':3}
email_to_name = {e:'John' for e in list(email_to_id)[:3]}
email_to_name['mary@m.com'] = 'Mary'

class DSU:
    def __init__(self,n): self.p=list(range(n))
    def find(self,x): self.p[x]=self.p[self.p[x]] if self.p[x]!=x else x; return self.p[x] if self.p[x]==x else self.find(self.p[x])
    def union(self,x,y): self.p[self.find(x)]=self.find(y)

dsu=DSU(4); dsu.union(0,1); dsu.union(1,2)
for row in collect_components(email_to_id, email_to_name, dsu):
    print(row)

วิธีแก้ปัญหาการผสานบัญชีฉบับสมบูรณ์

นี่คือวิธีแก้ปัญหาฉบับสมบูรณ์ที่รวมทั้งสามขั้นตอนเข้าด้วยกัน ได้แก่ สร้างการจับคู่อีเมลกับ ID, union อีเมลภายในแต่ละบัญชี และรวบรวมอีเมลที่จัดกลุ่มตามราก DSU ความซับซ้อนด้านเวลาโดยรวมคือ O(n × m × alpha(n × m)) โดย n คือจำนวนบัญชี และ m คือจำนวนอีเมลสูงสุดต่อบัญชี ซึ่งในทางปฏิบัติเท่ากับ O(n × m)

ความซับซ้อนด้านพื้นที่คือ O(n × m) สำหรับพจนานุกรมอีเมลและอาร์เรย์ DSU วิธีนี้จัดการการผสานแบบส่งต่อได้อย่างถูกต้อง: หากบัญชี A มีอีเมล X ร่วมกับบัญชี B และบัญชี B มีอีเมล Y ร่วมกับบัญชี C บัญชี A, B และ C จะถูกรวมเป็นกลุ่มเดียวกันทั้งหมด

from collections import defaultdict

def accounts_merge(accounts):
    email_to_id = {}
    email_to_name = {}
    eid = 0

    for account in accounts:
        name = account[0]
        for email in account[1:]:
            if email not in email_to_id:
                email_to_id[email] = eid
                eid += 1
            email_to_name[email] = name

    parent = list(range(eid))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    def union(x, y):
        parent[find(x)] = find(y)

    for account in accounts:
        first_id = email_to_id[account[1]]
        for email in account[2:]:
            union(first_id, email_to_id[email])

    root_to_emails = defaultdict(list)
    for email, i in email_to_id.items():
        root_to_emails[find(i)].append(email)

    return [[email_to_name[emails[0]]] + sorted(emails)
            for emails in root_to_emails.values()]

accounts = [['John','a@m.com','b@m.com'],['John','c@m.com'],
            ['Mary','d@m.com'],['John','b@m.com','c@m.com']]
for row in accounts_merge(accounts):
    print(row)

ทางเลือก BFS/DFS สำหรับการรวมบัญชี

แนวทางทางเลือกคือการสร้างกราฟจากอีเมลไปยังบัญชี โดยให้อีเมลเป็นโหนด และเชื่อมโหนดด้วยเส้นเชื่อมเมื่ออีเมลเหล่านั้นปรากฏอยู่ในบัญชีเดียวกัน จากนั้น BFS/DFS จะค้นหาองค์ประกอบที่เชื่อมต่อกันแต่ละองค์ประกอบ วิธีนี้ถูกต้อง แต่จำเป็นต้องสร้างกราฟอย่างชัดเจนและเรียกใช้ BFS จากอีเมลทุกฉบับที่ยังไม่ได้เยี่ยมชม จึงมีโค้ดมากกว่าและทำความเข้าใจได้ยากกว่า DSU

DSU สะอาดกว่า เพราะโครงสร้าง union-find แสดงการเป็นสมาชิกขององค์ประกอบได้โดยธรรมชาติ โดยไม่ต้องมีรายการเพื่อนบ้านอย่างชัดเจน กรณีเดียวที่ BFS เหมาะกว่าคือเมื่อคุณต้องการสร้างเส้นทางจริงหรือสายโซ่ของอีเมลที่ใช้ร่วมกันระหว่างบัญชีสองบัญชีขึ้นมาใหม่

# BFS alternative (for comparison)
from collections import defaultdict, deque

def accounts_merge_bfs(accounts):
    email_to_accounts = defaultdict(set)
    for i, account in enumerate(accounts):
        for email in account[1:]:
            email_to_accounts[email].add(i)

    visited_accounts = set()
    result = []

    for i, account in enumerate(accounts):
        if i in visited_accounts:
            continue
        queue = deque([i])
        emails_in_group = set()
        while queue:
            acc_idx = queue.popleft()
            if acc_idx in visited_accounts:
                continue
            visited_accounts.add(acc_idx)
            for email in accounts[acc_idx][1:]:
                emails_in_group.add(email)
                for j in email_to_accounts[email]:
                    queue.append(j)
        result.append([account[0]] + sorted(emails_in_group))
    return result

accounts = [['John','a@m.com','b@m.com'],['John','b@m.com','c@m.com'],['Mary','d@m.com']]
for row in accounts_merge_bfs(accounts):
    print(row)

สรุปเป็นกรณีทั่วไป: องค์ประกอบที่เชื่อมต่อกันในกราฟ

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

ขั้นตอนวิธีทั่วไปมีดังนี้เสมอ: (1) กำหนด ID จำนวนเต็มให้แต่ละรายการ (2) ทำ union ระหว่าง ID ของรายการที่ประกาศว่าเทียบเท่ากัน และ (3) จัดกลุ่มรายการตามรากของ DSU โดยพื้นฐานแล้ว DSU คือ เครื่องมือจัดกลุ่ม สำหรับความสัมพันธ์สมมูล

# Generalised grouping template
def group_equivalents(items, equivalences):
    item_to_id = {item: i for i, item in enumerate(items)}
    n = len(items)
    parent = list(range(n))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    def union(x, y):
        parent[find(x)] = find(y)

    for a, b in equivalences:
        if a in item_to_id and b in item_to_id:
            union(item_to_id[a], item_to_id[b])

    groups = {}
    for item in items:
        root = find(item_to_id[item])
        groups.setdefault(root, []).append(item)
    return list(groups.values())

# Example: merging duplicate customer records
customers = ['Alice-NY','Alice-LA','Bob','Alice-TX','Carol']
links = [('Alice-NY','Alice-LA'),('Alice-LA','Alice-TX')]
print(group_equivalents(customers, links))

การจัดการกรณีขอบ

กรณีขอบที่สำคัญในการรวมบัญชีมีดังนี้:

  • บัญชีที่มีอีเมลเดียว: บัญชีที่มีอีเมลเพียงหนึ่งฉบับจะเป็นองค์ประกอบของตัวเอง เว้นแต่จะมีบัญชีอื่นใช้อีเมลนั้นร่วมกัน
  • ชื่อเดียวกันแต่เป็นคนละคน: การที่ชื่อ “จอห์น” ปรากฏอยู่ในสองบัญชี ไม่ได้หมายความว่าเป็นบุคคลเดียวกัน มีเพียงอีเมลที่ใช้ร่วมกันเท่านั้นที่ทำให้บัญชีถูกรวมกัน ชื่อจะจัดเก็บแยกตามอีเมล ไม่ใช่ตามองค์ประกอบ
  • บัญชีว่าง: ควรข้ามบัญชีที่ไม่มีอีเมล เพื่อหลีกเลี่ยงข้อผิดพลาดเกี่ยวกับดัชนี

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

# Edge case: two Johns with no shared email => separate output
accounts = [
    ['John', 'john_a@m.com'],
    ['John', 'john_b@m.com'],   # different email => different component
    ['Mary'],                    # no emails => skip
]

def accounts_merge_safe(accounts):
    email_to_id = {}; email_to_name = {}; eid = 0
    for account in accounts:
        name = account[0]
        for email in account[1:]:
            if email not in email_to_id:
                email_to_id[email] = eid; eid += 1
            email_to_name[email] = name

    parent = list(range(eid))
    def find(x):
        while parent[x]!=x: parent[x]=parent[parent[x]]; x=parent[x]
        return x
    def union(x,y): parent[find(x)]=find(y)

    for account in accounts:
        if len(account) < 2: continue          # skip no-email accounts
        first = email_to_id[account[1]]
        for email in account[2:]:
            union(first, email_to_id[email])

    from collections import defaultdict
    groups = defaultdict(list)
    for email, i in email_to_id.items():
        groups[find(i)].append(email)
    return [[email_to_name[e[0]]] + sorted(e) for e in groups.values()]

for row in accounts_merge_safe(accounts):
    print(row)

จำนวนองค์ประกอบที่เชื่อมต่อกันในกราฟ

ปัญหาที่เกี่ยวข้อง (LeetCode 323) ถามถึงจำนวนองค์ประกอบที่เชื่อมต่อกันในกราฟไม่มีทิศทาง ปัญหานี้ง่ายกว่าการรวมบัญชี: เริ่มต้น DSU ด้วยโหนด n โหนด ประมวลผลเส้นเชื่อมทั้งหมดด้วย union แล้วนับรากที่แตกต่างกัน

วิธีที่กระชับที่สุดในการนับองค์ประกอบคือกำหนดให้ตัวแปร count เริ่มต้นที่ n แล้วลดค่าลงทุกครั้งที่ union สำเร็จและรวมองค์ประกอบที่แตกต่างกันสององค์ประกอบเข้าด้วยกัน อีกทางเลือกหนึ่งคือ นับจำนวนโหนด i ที่ find(i) == i เมื่อจบการทำงาน

def count_components(n, edges):
    parent = list(range(n))

    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    count = n
    for u, v in edges:
        pu, pv = find(u), find(v)
        if pu != pv:
            parent[pu] = pv
            count -= 1
    return count

print(count_components(5, [[0,1],[1,2],[3,4]]))  # 2: {0,1,2} and {3,4}
print(count_components(5, [[0,1],[1,2],[2,3],[3,4]]))  # 1: all connected
print(count_components(5, []))   # 5: no edges, all isolated

องค์ประกอบที่เล็กที่สุดและองค์ประกอบที่ใหญ่ที่สุด

เมื่อ DSU ของคุณติดตามขนาดขององค์ประกอบแล้ว คุณจะตอบคำถามอย่าง “องค์ประกอบที่เชื่อมต่อกันที่ใหญ่ที่สุดมีขนาดเท่าใด” หรือ “มีองค์ประกอบกี่องค์ประกอบที่มีโหนด 3 โหนดพอดี” ได้ในเวลา O(n) โดยสแกนอาร์เรย์ขนาดที่โหนดราก

คำถามลักษณะนี้ปรากฏในปัญหาอย่าง “ค้นหาเกาะที่เชื่อมต่อกันที่ใหญ่ที่สุด” บนตาราง หรือ “ระบุพาร์ทิชันของเครือข่ายที่เล็กที่สุด” หลังจากทำ union ทั้งหมดเสร็จแล้ว ให้สแกนหาโหนด i ที่ find(i) == i (โหนดเหล่านี้คือราก) แล้วตรวจสอบขนาดของโหนดเหล่านั้น

class DSU:
    def __init__(self, n):
        self.parent = list(range(n))
        self.size = [1] * n
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    def union(self, x, y):
        px, py = self.find(x), self.find(y)
        if px == py: return
        if self.size[px] < self.size[py]: px, py = py, px
        self.parent[py] = px
        self.size[px] += self.size[py]

def component_stats(n, edges):
    dsu = DSU(n)
    for u, v in edges:
        dsu.union(u, v)
    sizes = [dsu.size[i] for i in range(n) if dsu.find(i) == i]
    print('Component sizes:', sizes)
    print('Largest component:', max(sizes))
    print('Smallest component:', min(sizes))
    print('Number of components:', len(sizes))

component_stats(8, [(0,1),(1,2),(3,4),(5,6),(6,7)])

เคล็ดลับการสัมภาษณ์สำหรับปัญหา DSU

เมื่อพบปัญหาที่เกี่ยวกับ การรวมกลุ่ม คำถามเกี่ยวกับการเชื่อมต่อ หรือ การค้นหาเส้นเชื่อมส่วนเกิน ให้คิดถึง DSU ทันที ในการสัมภาษณ์ ควรกล่าวถึงการเพิ่มประสิทธิภาพทั้งสองแบบ (การบีบอัดเส้นทาง + การทำ union ตามอันดับ/ขนาด) เพื่อแสดงความเข้าใจเชิงลึก แม้ว่า DSU แบบพื้นฐานที่ง่ายกว่าจะผ่านได้ภายใต้ข้อจำกัดที่กำหนดก็ตาม

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

# Interview checklist for DSU problems
checklist = [
    '1. Identify: is this a grouping/connectivity/cycle problem?',
    '2. Map problem entities to integer node IDs if needed',
    '3. Implement DSU with path compression + union by rank/size',
    '4. Process all relationships (edges/pairs) with union()',
    '5. Answer queries using find() and size/count tracking',
    '6. Handle edge cases: already connected, single nodes, no edges',
    '7. Check output format: sorted? 1-indexed? Name included?',
    '8. State time complexity: O(n * alpha(n)) ~ O(n)',
]
for item in checklist:
    print(item)

ตรวจสอบความเข้าใจ

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

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า การรวมบัญชีเป็นปัญหาองค์ประกอบที่เชื่อมต่อกัน โดยมีอีเมลเป็นโหนดและบัญชีเป็นตัวเชื่อมอีเมล DSU แก้ปัญหานี้โดยจับคู่อีเมลกับ ID จำนวนเต็ม ทำ union ระหว่าง ID ภายในแต่ละบัญชี และจัดกลุ่มตามราก และ รูปแบบการจัดกลุ่มด้วย DSU เดียวกันนี้ใช้ได้กับปัญหาคลาสสมมูลหรือปัญหาการจัดกลุ่มทุกประเภท บทถัดไปเราจะเปลี่ยนไปเรียนการจัดการบิต โดยเริ่มจากตัวดำเนินการ AND, OR, XOR, NOT และการเลื่อนบิตซึ่งเป็นพื้นฐาน

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

บทเรียน “การรวมบัญชีและองค์ประกอบเชื่อมโยง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การรวมบัญชีและองค์ประกอบเชื่อมโยง”

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

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

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

บทเรียน “การรวมบัญชีและองค์ประกอบเชื่อมโยง” ใช้เวลานานแค่ไหน

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

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

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

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

  1. DSU กับการบีบอัดเส้นทาง
  2. การรวมตามอันดับและขอบเขตอินเวอร์สแอกเคอร์มันน์
  3. การเชื่อมโยงเกินจำเป็นและการตรวจจับวงจร
  4. การรวมบัญชีและองค์ประกอบเชื่อมโยง
← กลับไปที่ Coding Interview Prep