当前位置: 首页 > 面试经验 >

笔试编程题

优质
小牛编辑
120浏览
2023-03-28

笔试编程题

有选择题
三道编程题
第一题:
输入
2
1 3
2 5
第一行是有n个信封,后面的每一行是n个信封的长和宽,只有小信封的长款大小比大信封小才能套进去,问最多能套多少个信封?
import sys

if __name__ == "__main__":
    # 读取第一行的n
    n = int(sys.stdin.readline().strip())
    ans = []
    for i in range(n):
        # 读取每一行
        line = sys.stdin.readline().strip()
        # 把每一行的数字分隔后转化成int列表
        values = list(map(int, line.split()))
        ans.append(values)
    print(ans)
    ans.sort(key=lambda x: (x[0], x[1]))
    print(ans)
    dp = [0 for i in range(n)]
    for i in range(1, n):
        hope = []
        for j in range(0, i):
            if ans[i][1] > ans[j][1]:
                hope.append(dp[j]+1)
        if  len(hope)!=0:
            print(hope)
            dp[i] = max(hope)

    print(dp[-1])




第二题:

输入 数组的长度n和一个数组,全是整数,求乘积为正数的最大连续数组的长度
import sys

if __name__ == "__main__":
    # 读取第一行的n
    line = sys.stdin.readline().strip()
    values = list(map(int, line.split()))
    n = len(values)
    dp = [0]
    p = -1
    for i in range(n):
        if values[i]>0:
            dp.append(dp[-1]+1)
        elif values[i]==0:
            dp.append(0)
            p = -1
        else:
            if p!=-1:
                dp.append(dp[p-1]+dp[-1]+2)
                p = -1
            else:
                dp.append(0)
                p = i+1
    print(dp)
    print(max(dp))


这个题目的case全过,但是代码是有问题的 比如
0 0 1 1 -1 -1 -1  1 2 3 4  应该是6 但是输出4
如果牛友有很好的方法,欢迎戳我

第三题:
也是一个字符串,找到最长的回文子串
输入
5
abnca
输出 3 (a+a与a之间任意字母+a)
import sys

if __name__ == "__main__":
    line = list(sys.stdin.readline().strip())
    dp = [[1 for j in range(len(line))] for i in range(len(line))]
    for j in range(0, len(line)):
        for i in range(j-1, -1, -1):
            if j - i == 1:
                if line[i] == line[j]:
                    dp[i][j] = 2
                else:
                    continue
            else:
                for x in range(i, j ):
                    if line[x] == line[j] and j - x > 1:
                        print(x,i,j)
                        dp[i][j] = max(dp[x + 1][j - 1] + 2,dp[i][j] ,dp[i][j-1])
                    elif line[x] == line[j] and j - x == 1:
                        dp[i][j] = max(2,dp[i][j] ,dp[i][j-1])
                    else:
                        dp[i][j] = max( dp[i][j], dp[i][j - 1])
    print(dp[0][-1])

题目要求时间O(n^2) 我的方法是O(n^3) (笔试时还没写完,后面写的呜呜呜)

#笔试算法题#
 类似资料: