大語言模型無法理解連結串列 Large Language Models Fails to Understand Chained Table[up to 202407017]

Zebro發表於2024-07-17

大模型可以翻轉連結串列,但是隻能翻轉單個元素連結串列。一但牽扯到分組操作,就不會了。

Case:

以K個元素為一組位翻轉連結串列,每一組內部元素順序不變。

Reverse the chained table in group of K elements, don't change the order in each group.

Hand written:

 1 class Node():
 2     def __init__(self, v=0, nxt = None) -> None:
 3         self.value = v
 4         self.nxt = nxt
 5     def __str__(self) -> str:
 6         return str(self.value)
 7 
 8 class chain():
 9     def __init__(self, h=None,l=0) -> None:
10         self.head = h
11         self.len = l
12 
13     def insert(self,v):
14 
15         self.len+=1
16         n = self.head
17         if self.head is None:
18             self.head = Node(v)
19         else:
20             while n.nxt is not None:
21                 n = n.nxt
22             n.nxt = Node(v)
23     def __str__(self):
24         n = self.head
25         res = []
26         while n is not None:
27             res.append(n.value)
28             n = n.nxt
29 
30         return ",".join([str(_) for _ in res])
31 
32         
33     def reverse_(self,k):
34         
35         if self.len < k:
36             return
37         prev = None
38 
39         stay = self.head
40         cur = self.head
41         # stay
42         #     cur
43         #       nxt
44         # 1 2 3 4 5 6 7
45         while cur is not None:
46             
47             nxt = cur.nxt
48             ct = k
49             print(cur)
50             while ct-1 >0:
51                 ct-=1
52                 if nxt is not None:
53                     cur = nxt
54                     nxt = nxt.nxt
55                     
56                 else:
57                     break
58 
59             print("connect", cur, "to", prev)
60             cur.nxt = prev
61             prev = stay
62             
63             stay = nxt
64             cur = nxt
65         self.head = prev
66                 
67 
68 c = chain()
69 c.insert(1)
70 c.insert(2)
71 c.insert(3)
72 c.insert(4)
73 c.insert(5)
74 c.insert(6)
75 c.insert(7)
76 c.reverse_(3)
77 print(c)

Result:

1
connect 3 to None
4
connect 6 to 1
7
connect 7 to 4
7,4,5,6,1,2,3

Chatgpt:

要實現按 
𝑘
k 個元素一組逆轉一個連結串列的功能,可以使用以下步驟和程式碼。這個問題的核心思想是遍歷連結串列並在每 
𝑘
k 個元素的地方進行逆轉。以下是詳細的步驟和相應的程式碼實現:

步驟
初始化和邊界檢查:首先檢查連結串列是否為空或 
𝑘
k 是否為無效值(如 
𝑘
≤
1
k≤1),如果是,直接返回連結串列。
計算連結串列長度:遍歷連結串列來計算其長度,這有助於判斷是否還有足夠的元素來進行下一次逆轉。
逆轉連結串列部分:
在每 
𝑘
k 個節點處進行逆轉。
使用三個指標來逆轉連結串列部分:prev,curr,和 next。
逆轉後將子連結串列重新連線到主連結串列中。
調整指標繼續下一個子連結串列的處理。
程式碼實現(Python)
以下是按 
𝑘
k 個元素一組逆轉連結串列的 Python 實現:

python
複製程式碼
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseKGroup(head, k):
    # 輔助函式:逆轉連結串列部分
    def reverse(start, end):
        prev, curr = None, start
        while curr != end:
            next_temp = curr.next
            curr.next = prev
            prev = curr
            curr = next_temp
        return prev
    
    # 輔助函式:獲取連結串列長度
    def get_length(node):
        length = 0
        while node:
            length += 1
            node = node.next
        return length
    
    # 邊界檢查
    if head is None or k <= 1:
        return head
    
    length = get_length(head)
    dummy = ListNode(0)
    dummy.next = head
    prev = dummy
    
    while length >= k:
        start = prev.next
        end = start
        for _ in range(k):
            end = end.next
        # 逆轉連結串列部分
        new_start = reverse(start, end)
        prev.next = new_start
        start.next = end
        prev = start
        length -= k
    
    return dummy.next

# 輔助函式:列印連結串列
def print_list(node):
    while node:
        print(node.val, end=" -> ")
        node = node.next
    print("None")

# 示例連結串列構建
nodes = [ListNode(i) for i in range(1, 9)]
for i in range(len(nodes) - 1):
    nodes[i].next = nodes[i + 1]

head = nodes[0]
k = 3

# 逆轉連結串列
new_head = reverseKGroup(head, k)

# 列印逆轉後的連結串列
print_list(new_head)
解釋
輔助函式reverse(start, end):用於逆轉從 start 到 end 的連結串列部分。
輔助函式get_length(node):計算連結串列的長度。
主要邏輯reverseKGroup(head, k):
建立一個哨兵節點 dummy,使得操作更簡便。
遍歷連結串列並在每 
𝑘
k 個節點處呼叫 reverse 函式進行逆轉。
更新指標以準備處理下一段連結串列。
這個程式碼實現透過按 
𝑘
k 個元素一組逆轉連結串列,達到了預期的功能。

ChatGLM:

相關文章