2016-11-18 41 views
-3

我有一個值序列[1,2,3,4,1,5,1,6,7],我必須找到最長的子序列增加長度。但是,一旦達到低於前一個數字的數字,該功能就需要停止計數。這種情況下的答案是[1,2,3,4]。因爲在重置之前它有4個值。我將如何爲此編寫Python代碼?從一個序列中提取最大長度的子序列[PYTHON]

注意:尋找「最長的增長子序列」似乎是一個常見的挑戰,因此在線搜索我找到了很多可以計算整個序列長度的解決方案,並返回一個遞增值的子序列,忽略任何減少,所以在這種情況下,它會返回[1,2,3,4,5,6,7]。這不是我正在尋找的。

它需要對每個子序列進行計數,並在達到低於前一個數字的數字時重置計數。然後它需要比較所有計數的子序列,並返回最長的子序列。

在此先感謝。

+4

結果調用max這看起來很瑣碎的算法,明智的,你嘗試過解決呢? StackOverflow不是一個代碼寫入服務。 –

+0

輸入時應該返回什麼:'[1,2,3,9,2,3,4,5,3,0,1,2,3,4,5,6]' – nephi12

+0

就像它被描述爲我的算法會存儲每個子序列的長度1,2,3 1,2,3,9是4個值,2,3,4,5是4,3是1個值,以及0,1,2,3,4,5, 6是6個值,所以它只會返回最後一個最長的子序列。 –

回答

0
b = [4,1,6,3,4,5,6,7,3,9,1,0] 

def findsub(a): 
    start = -1 
    count = 0 
    cur = a[0] 
    for i, n in enumerate(a): 
    if n is cur+1: 
     if start is -1: 
     start = i - 2 
     count=1 
     count+=1 
     cur = n 
    if n < cur and count > 1: 
     return [a[j] for j in range(start,start+count+1)] 


print findsub(b) 

一個有點草率的算法,但我相信它做你想做的。通常我不會簡單地向你展示代碼,但我懷疑這是你想要的,我希望你可以從中學習,並從你學到的東西中創建你自己的代碼。

一個稍顯好看的方式,因爲我不喜歡的是:

b = [1,2,0,1,2,3,4,5] 

def findsub(a): 
    answer = [a[0]] 
    for i in a[1:]: 
    if answer[-1] + 1 is i: 
     answer.append(i) 
    if not len(answer) > 1: 
     answer = [i] 
    elif i < answer[-1] and len(answer) > 1: 
     return answer 
    return answer 



print findsub(b) 
+0

我認爲這會找到第一個有效的子序列,而不是最長的。嘗試'[1,2,0,1,2,3,4,5]'。 –

+0

@ TadhgMcDonald-Jensen我們不得不在第一次停止後,新值小於當前值。 – nephi12

+0

謝謝,nephi12!它以我需要的方式工作,一旦達到低於前一個的數字,它就停止計數。我需要它返回*最長的子序列,但不一定是第一個。因爲我實際上是在試圖從中吸取教訓,請問你能否給我一個提示,說明我需要改變這一點,我會自己想出來的? –

0

你需要做到以下幾點:

  1. 創建一個功能W給定一個列表,返回索引最後一項從列表的開始處開始並不嚴格增加。

    • 例如,給出以下列表:[1,2,3,4,1,2,3], [4,2,1], [5,6,7,8],它應該返回414,分別爲每個列表
  2. 創建一個變量maxim和值設置爲0

  3. 重複以下操作,直到列表爲空
    • 打電話給你的清單上的功能W,讓我們調用的返回值x
    • 如果x大於maxim
      • 設置maximx
      • 在這一點上,如果你想存儲這個序列,就可以使用list-slice notation以獲取包含序列的列表部分。
    • 從列表中刪除列表中的部分

最後,打印maxim如果你保存你的包含最長序列表的部分,然後打印的最後一個你有

1

考慮一個函數,可以生成所有可能的升序子序列,您將從一個空列表開始,添加項目直到一個元素少於(或等於?)前一個節點(yield)的子序列和r帶有新的子序列。

一個實現用發電機可能是這樣的:

  1. 要完成發電機的StopIteration需求是 提出的,所以我們可以只:

    有關處理空序列的
    def all_ascending_subsequences(sequence): 
        #use an iterator so we can pull out the first element without slicing 
        seq = iter(sequence) 
    
        try: #NOTE 1 
         last = next(seq) # grab the first element from the sequence 
        except StopIteration: # or if there are none just return 
         #yield [] #NOTE 2 
         return 
    
        sub = [last] 
        for value in seq: 
         if value > last: #or check if their difference is exactly 1 etc. 
          sub.append(value) 
         else: #end of the subsequence, yield it and reset sub 
          yield sub 
          sub = [value] 
         last = value 
    
        #after the loop we send the final subsequence 
        yield sub 
    

    兩個音符讓從next(seq) propegate了一個 - 然而,當from __future__ import generator_stop是 效應會導致RuntimeError所以要兼容未來我們 需要ŧ o趕上它並明確return

  2. 正如我寫它通過一個空列表 all_ascending_subsequences將不會產生任何值,這可能不是 是所需的行爲。隨意取消註釋yield []至 傳遞空列表時生成一個空列表。

然後,你可以得到最長的通過與key=len

b = [1,2,3,4,1,5,1,6,7] 

result = max(all_ascending_subsequences(b),key=len) 
print("longest is", result) 

#print(*all_ascending_subsequences(b)) 
+0

感謝你的描述,我以一種能夠真正理解它的方式來描述它,這對我有很大的幫助,因爲如果我不知道我在說什麼,那麼我就不適合使用*。 –

+0

我很高興這有助於解決問題,但是你問你的問題的方式是否真的適合於「這是它的代碼」類型的解決方案 - 你會更有可能得到(更多)像我這樣有用的解釋性答案(更快)如果你已經展示了你曾經嘗試或談論過什麼,特別是你遇到了什麼問題。 –