算法练习
question1
问题描述
题目:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h,k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
代码实现
high = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
#将原列表按照k值升序排列
high.sort(key=lambda data: data[1], reverse=False)
#将原列表按照h值降序排列
high.sort(key=lambda data: data[0], reverse=True)
#[[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]]
output = []
for item in high:
#按照顺序一一插入
output.insert(item[1], item)
print(output)
question2
问题描述
给定一个三角形,从顶部到底部找到最小路径和。 每个步骤,您可以移动到下面的行上的相邻数字。
代码实现
list = [
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
def minimumTotal(triangle):
nums = triangle
if nums == [[]]:
return 0
for b in range(len(nums) - 2, -1, -1):
for a in range(len(nums[b])):
nums[b][a] = nums[b][a] + min(nums[b + 1][a], nums[b + 1][a + 1])
return triangle[0][0]
print(minimumTotal(list))
question3
问题描述
有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生
中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过
d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
代码实现
n = int(input('请输入学生个数:\n'))
energy_input = input('请输入%s个学生的能力值:\n' % n)
term_input = input('请输入学生个数和最大学生标号:\n')
energy = [int(i) for i in energy_input.split(' ')]
k, d = int(term_input.split(' ')[0]), int(term_input.split(' ')[1])
dp = [(i, i) for i in energy]
for i in range(1, k):
dp1 = dp[:i]
for j in range(i, n):
temp = []
for z in range(j - d, j):
if z < 0:
continue
else:
temp.append(energy[j] * dp[z][0])
temp.append(energy[j] * dp[z][1])
# print('temp')
# print(temp)
dp1.append((max(temp), min(temp)))
# print('dp1')
# print(dp1)
dp = dp1
# print('dp')
# print(dp)
print(max([max(each) for each in dp]))
question4
问题描述 1:
全班有 40 人, 每排 6 个人,每次收作业要求学号按顺序排列好之后交给老师, 方便统计. 请说出你的解决方案。
方案:
将各组作业一组一组放在一个列表中,采用希尔排序,间隔为6.
问题描述 2:
封装所有的排序算法到自定义模块 mySort,参考模块与包的知识, 实现打包功能。 如果可以发布到 pypi 网站上.