การรวมบัญชีและองค์ประกอบเชื่อมโยง
จัดกลุ่มบัญชีที่ใช้อีเมลร่วมกันโดยถือว่าอีเมลเป็นโหนดของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DSU กับการบีบอัดเส้นทาง
- การรวมตามอันดับและขอบเขตอินเวอร์สแอกเคอร์มันน์
- การเชื่อมโยงเกินจำเป็นและการตรวจจับวงจร
- การรวมบัญชีและองค์ประกอบเชื่อมโยง