CodeSprout程式萌芽
困難第 306 題 · 樣本雙路分流
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Python

官方解答|樣本雙路分流

官方解答

Python #306:樣本雙路分流

解題規則

實驗站用一個工具判斷樣本去向,另一個工具計算要保存的樣本資訊。

寫 accepts(x,index,values) 判斷該格是否屬於「大於0的值」;transform(x,index,values) 則回傳數值與索引的距離。每格都先形成 [原索引,轉換結果],依條件分別放入符合與不符合清單。回傳 [符合清單,不符合清單],各自保持原順序;兩個分流都要保留,不可丟棄不符合項。

處理步驟

每格先計算 [原索引,轉換結果],再用 accepts 分流;兩邊各自保持原順序。

為何正確

輔助函式只使用自己的參數,回傳該規則的結果;solve 按規定順序傳入原值或前一步結果。因此每次函式呼叫都完成其指定工作,組合結果也符合題目。

邊界與注意事項

本題輸入範圍:清單長度 0~12;每個值為 -100~100 的整數。

範例追蹤

依參數順序 values 傳入 [[3,-2,0,5,-2]]。關鍵中間資料為 accepted = [[0, 3], [3, 2]];refused = [[1, 3], [2, 2], [4, 6]];index = 4;x = -2。最後回傳 [[[0, 3], [3, 2]], [[1, 3], [2, 2], [4, 6]]]。結果由 return 回傳,不使用 print。

複雜度

設輸入總長度 n;游標或迴圈逐次前進,最壞時間 O(n),保存歷史與回傳結果最壞需要 O(n) 空間。

CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式

def accepts(x, index, values):
    return x > 0

def transform(x, index, values):
    return abs(x - index)

def solve(values):
    accepted = []
    refused = []
    for (index, x) in enumerate(values):
        item = [index, transform(x, index, values)]
        if accepts(x, index, values):
            accepted.append(item)
        else:
            refused.append(item)
    return [accepted, refused]

留言討論 0