2018美團點評校招 K的倍數

2021-08-07 15:54:08 字數 1356 閱讀 4230

序列中任意個連續的元素組成的子串行被稱為該序列的字串

現在給你乙個序列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 構成的字串,定義它們的距離為對應位置不同的字...