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

你可能感兴趣的:(2018美团校招笔试)