【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python

【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第1张图片
【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第2张图片

这题很简单了,是换行输出要注意下。

n = int(input())
a = []
while n:
    n-=1
    s = input()
    s = s[-6:]
    s = list(map(int, s))
    #s.sort()
    s = int(''.join([str(t) for t in s]))
    a.append(s)
a.sort()
for i in range(len(a)):
    print(a[i])

【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第3张图片
【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第4张图片
最长回文子序列
看了网上的,用递归和dp做的。

参考 https://blog.csdn.net/geekmanong/article/details/51056375

str[0…n-1]是给定的字符串序列,长度为n,假设lps(0,n-1)表示序列str[0…n-1]的最长回文子序列的长度。

  1. 如果str的最后一个元素和第一个元素是相同的,则有:lps(0,n-1)=lps(1,n-2)+2;例如字符串序列“AABACACBA”,第一个元素和最后一个元素相同,其中lps(1,n-2)表示红色部分的最长回文子序列的长度;
  2. 如果str的最后一个元素和第一个元素是不相同的,则有:lps(0,n-1)=max(lps(1,n-1),lps(0,n-2));例如字符串序列“ABACACB”,其中lps(1,n-1)表示去掉第一元素的子序列,lps(0,n-2)表示去掉最后一个元素的子序列。
def lps(s,i,j):
    if i==j:
        return 1
    if i>j :
        return 0
    if s[i] == s[j]:
        return lps(s, i + 1, j - 1) + 2
    return max(lps(s, i, j - 1), lps(s, i + 1, j))
s = input()
n=len(s)
res = lps(s,0,n-1)
print(res)

只过了80%。复杂度太高,一定要用dp才行。

    def lps(s,n):
        dp = [[0 for col in range(10)] for row in range(10)]
        
        for i in range(n):
            dp[i][i] = 1
        for i in range(1,n):
            tmp = 0
            #考虑所有连续的长度为i+1的子串,s[j....j+i]  这个很厉害 子串
            for j in range(n-i):
                if s[j] == s[j+i]:
                    tmp = dp[j+1][j+i-1]+2
                else:
                    tmp = max(dp[j + 1][j + i], dp[j][j+i-1])
                dp[j][j+i] = tmp
        return dp[0][n-1]#返回字符串str[0...n-1]的最长回文子序列长度
    
    
    s = input()
    #s='adbca'
    res = lps(s,len(s))
    print(res)

【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第5张图片
【快手】2019年秋季校园招聘笔试试卷--算法B试卷(字符串排序、最长回文子序列、排版)python_第6张图片
P ∗ H S ≥ ∑ i = 1 n a i ∗ S W \frac{P*H}{S}\geq\sum_{i=1}^n \frac{ai*S}{W} SPHi=1nWaiS
右边是向上取整math.ceil()
不应该化简的,好像就错了,最后只过了67%
(有点问题)

n,p,h,w = map(int,input().split())
a=[int(k) for k in input().split()]

summ = sum(a)
alll = int(p*h*w/summ)
s=1
while alll>=s*s:
    s+=1
print(s-1)

补一个同学的,应该比较正确:

n,p,h,w = map(int,raw_input().split())
nums = map(int,raw_input().split())

def getRowNum(nums,w,s):
    rowNum = 0
    for num in nums:
        rowNum+=num*s/w
    return rowNum

s = 1
while getRowNum(nums,w,s)<=p*h/s:
    s += 1
print s-1

你可能感兴趣的:(笔试)