好未来笔试编程题[python实现]

借鉴一些牛友和自己的思想,整理了一下前5道题的python实现,没有测试过是否AC,所以不确定代码中有没有不通过的case,恳请大佬指正,轻喷谢谢~
1.一个数分成几份,可以被 3 整除的最大份数。比如 12345 分成12 3 45 结果为3.
思路:贪心算法

n = input()
m = 0 # 计数
string = '' # 字符组合
c1,c2 = 0,0 # 余数分别为1和2的情况
for i in range(len(n)):
    if int(n[i]) % 3 == 0:
        m += 1
        string = ''
        c1,c2=0,0
        continue
    string += n[i]
    if int(n[i]) % 3 == 1:
        c1 += 1
    else:
        c2 += 1
    if (string != '' and int(string) % 3 == 0) or (c1>0 and c2>0):
        m += 1
        string = ''
        c1,c2=0,0
print(m)

2.根据x + y = x|y,给定x, 求满足要求的第 k 个 y
不是很懂位运算,所以就简单粗暴的枚举了

t = int(input()) # 表示输入t组数据
l_in = []
for i in range(t):
    x,k = input().strip().split() # 每组数据的x和k
    a = [int(x),int(k)]
    l_in.append(a) # 所有组数据的列表
for ax in l_in:
    l_out = []
    y = 1
    while y > 0 and len(l_out) < ax[1]: 当l_out长度达到k时就停止
        if ax[0] + y == ax[0] | y:
            l_out.append(y)
            y += 1
        else:
            y += 1
    print(l_out[-1]) # 打印出每组数据符合的第k个数据

3.给定数组[0-9] 和 boll_array[0111011110], 0表示可以输出,也可以不输出, 1必须输出对应位,输出所有可能情况(按字符串升序)

import copy
# a = [0,1,2,3,4,5,6,7,8,9] # 数字数组
# b = [0,1,1,1,0,1,1,1,1,0] # 对应的布尔值数组
b = list(map(int,input().strip().split()))
index = []
for i in range(0,len(b)):
    if b[i] == 1:
        b[i] = str(i) # 将布尔值为1的位置赋予对应的数值
    if b[i] == 0:
        index.append(i) # 记录布尔值为0的位置索引
        b[i] = '' # 同时赋予空
res = [b]
for ind in index:  
    for i in range(len(res)):
        c= copy.copy(res[i]) 
        c[ind] = str(ind) # 对结果列表中的每个组合依次添加布尔值为0的位置所对应的数字
        res.append(c)
for i in range(len(res)):
    res[i] = ''.join(res[i])
res.sort() # 排序
for i in res:
    print(i)

4.n 面筛子,m面有奖,有奖继续掷筛子,没奖结束。输入给定每面分数的数组 s, len(s) = n, 求期望。
数学题, ave_score = sum(s)/n
e = (n-m)/n avg_score (第一次就没奖)+ m/n (avg_score + e) (第一次有奖,相当于从头开始)
化简得到 e = sum(s_array)/n-m

n,m = input().strip().split()
sc = list(map(int,input().strip().split()))
e = sum(sc)/(int(n) - int(m))
print('%.2f' % e)

5.最大上升子序列和
思路:动态规划

a = [5,1,3,4,9,7,6,8]
a = list(map(int,input().strip().split()))
n = len(a)
d = [0 for i in range(n)]  # 子序列最后一个元素值为a[i]时,对应的最大子序列和d[i]
d[0] = a[0]
for i in range(1,len(a)):
    s = []
    for j in range(i):
        if a[i] > a[j]: # 找出子序列最后一个元素值小于当前元素的所有子序列
            s.append(d[j]+a[i]) 
        else:
            s.append(a[i])
    d[i] = max(s)
# print(d)
print(max(d))
#好未来##笔试题目##题解##秋招#
全部评论
666顶一个
点赞 回复
分享
发布于 2018-08-29 05:14
厉害了学长 标记一下 等会看
点赞 回复
分享
发布于 2018-08-29 07:08
阅文集团
校招火热招聘中
官网直投
第二个超时了吧
点赞 回复
分享
发布于 2018-08-29 07:43
第二个java不行,超时
点赞 回复
分享
发布于 2018-08-29 08:53
第五题少个条件吧,只看a[i] > a[j]不行吧,加上d[j]+a[i]>d[i]
点赞 回复
分享
发布于 2018-08-29 08:57
点赞 回复
分享
发布于 2018-08-29 09:18
厉害了静静
点赞 回复
分享
发布于 2018-08-29 09:36
静静,带带我
点赞 回复
分享
发布于 2018-08-29 10:38
第二题不能枚举啊 会超时
点赞 回复
分享
发布于 2018-08-29 12:54
想到第二题会超时,但我不太会位运算,求指教
点赞 回复
分享
发布于 2018-08-29 13:46
第一题为什么要判断余数 n = input() count = 0 tempsum = 0 for i in range(len(n)): tempsum += int(n[i]) if tempsum % 3 == 0: count += 1   tempsum = 0 print(count)
点赞 回复
分享
发布于 2018-08-29 18:14

相关推荐

点赞 71 评论
分享
牛客网
牛客企业服务