1. 程式人生 > >2018美團點評校招-K的倍數

2018美團點評校招-K的倍數

題目描述:

序列中任意個連續的元素組成的子序列被稱為該序列的字串
現在給你一個序列P和一個整數K,詢問元素和是K的倍數的子串的最大長度
比如序列{1,2,3,4,5},給定的整數K為5,其中滿足條件的子串為{5}、{2,3}、{1,2,3,4}
、{1,2,3,4,5},那麼答案就為5,因為最長的子串為{1,2,3,4,5};
如果滿足條件的子串不存在,就輸出0

輸入:

第一個含一個整數N1<=N<=10^5
第二行包含N個整數Pi,Pi表示序列P第i個元素的值。0<=Pi<=10^5
第三行包含一個整數K1<=K<=10^5

解題思路:

這裡提供一種O(N)複雜度的解題方案。

1、就是首先獲得陣列的累加和,即sum_s。(例如,[0,1,2,3,4]的累加和為[0,1,3,6,10]),這樣做的目的,其實為了得到,子序列的和,即前面兩個數的和為(3-0),第2個數到第三個數的和為6-1=(2+3)

2、然後,我們要求減少演算法的複雜度,那麼我們可以先對長度較長的子序列判斷它是否是K的整數倍。因此,我們首先取出子序列首尾的下標及其長度,並按長度排序。

3、對排好序的子序列一一遍歷,只要出現滿足情況的子序列,即為最長子序列。

程式碼實現:


from itertools import combinations
n=int(raw_input())
s=[int(i) for
i in raw_input().split()] k=int(raw_input()) sum_s=[0] lingshi=0 for i in s: lingshi+=i sum_s.append(lingshi) #取出子序列首尾的下標及其長度 sort_list=map(lambda x :[x[0],x[1],abs(x[0]-x[1])],list(combinations(range(len(sum_s)),2))) #按長度排序 sort_list=sorted(sort_list, key=lambda x:x[2],reverse=True) for x in sort_list: if
x[0]>x[1]: if (sum_s[x[0]]-sum_s[x[1]])%k==0: print x[0]-x[1] flag=0 break if x[1]>x[0]: if (sum_s[x[1]]-sum_s[x[0]])%k==0: print x[1]-x[0] flag=0 break if flag!=0: print 0