序列中任意個連續的元素組成的子串行被稱為該序列的字串
現在給你乙個序列p和乙個整數k,詢問元素和是k的倍數的子串的最大長度
比如序列,給定的整數k為5,其中滿足條件的子串為、、
、,那麼答案就為5,因為最長的子串為;
如果滿足條件的子串不存在,就輸出0
輸入:
第乙個含乙個整數n,1
<=n
<=10^5
第二行包含n個整數pi,pi表示序列p第i個元素的值。0
<=pi
<=10^5
第三行包含乙個整數k,1
<=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
#取出子串行首尾的下標及其長度
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
美團點評校招前端方向筆試題
1.請按順序寫出列印結果,並說明原因。var name global var obj bind window var bar new obj.foo settimeout function 0 console.log bar.name var bar3 bar2 bar bar2.name foo2...
美團點評2020校招測試方向筆試題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 256m,其他語言512m 將給定的字串,按照規則刪除字元,輸出刪除後的字串。刪除規則為 相同字元連續,則刪除,如 aaaab 刪除後的字串為 b 注 僅是單個字元連續才刪除,如babababa則不能刪除 輸入描述 輸入資料有多組,每組一行,僅...
2018美團點評春招C 試卷程式設計題
美團點評 2018 春招後台開發方向試卷 程式設計題 30.0分1 2 字串距離 時間限制 c c 語言2000ms 其他語言 4000ms 記憶體限制 c c 語言65536kb 其他語言 589824kb 題目描述 給出兩個相同長度的由字元a 和 b 構成的字串,定義它們的距離為對應位置不同的字...