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

这篇博客分享了五个Python编程题目及其解决方案,涵盖了贪心算法、位运算、回溯法、动态规划和数组操作。通过这些实例,探讨了如何在不同情境下运用这些算法来解决问题,对于提升编程技能和理解数据结构有很好的帮助。
摘要由CSDN通过智能技术生成

借鉴一些牛友和自己的思想,整理了一下前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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值