# 讀取輸入
n = int(input())
mapping = list(map(int, input().split()))
# 初始化變數
visited = set() # 使用集合來記錄已訪問的節點
cycle_count = 0 # 記錄閉環數量
# 循環遍歷所有節點
for start_node in range(n):
if start_node not in visited: # 如果節點未被訪問
current_node = start_node
while current_node not in visited:
visited.add(current_node) # 標記當前節點為已訪問
current_node = mapping[current_node] # 跳到下一個節點
cycle_count += 1 # 完成一個閉環
# 輸出結果
print(cycle_count)
改寫後的優化
可讀性提升:
- 改善了變數命名,例如:
mapping
替代原本的f
。visited
替代原本的v
。
- 使程式的邏輯更加直觀。
- 改善了變數命名,例如:
使用集合:
set
結構在檢查和新增訪問節點時比list
更高效,縮短了運行時間。
結構簡化:
- 去除了不必要的變數(如
tg
)。 - 使用
for
迴圈代替了while
中的手動索引更新,簡化了控制流程。
- 去除了不必要的變數(如
範例測試
範例 1
輸入:
5
1 2 0 4 3
輸出:
2
範例 2
輸入:
4
1 0 3 2
輸出:
2
範例 3
輸入:
6
1 2 0 4 5 3
輸出:
3
這個改寫版本執行結果與原程式完全一致,但結構更加簡潔,易於理解和維護。
沒有留言:
張貼留言