第14天
2020.07.08 周三
今天是高考的第二天,作为准大三的老同学我居然感到了削微紧张,做道算法题冷静下。
难度系数:简单
题目:面试题16.11跳水板
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例:
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
提示:
0 < shorter <= longer
0 <= k <= 100000
——————————我是分割线——————————
解法:
思路:官方给的这道题难度系数为简单,确实有很简单的解法。只要计算出短木板的块数和长木板的块数,并分别乘其长度,再相加即可求出一个结果,以此类推求出每一个结果组成列表。
特别注意这里题目要求的返回的长度要求从小到大。那么我从短木板数为0开始,长木板数为总木板数k减去短木板数,每次循环短木板数加一,直到短木板数等于总数k。将每次算出的结果添加到列表头部。这样得到的列表即为元素从小到大的列表。
要考虑到两种特殊情况:
1.k=0时。也就是说木板块数为0,即没有木板,无解,返回空列表[]
2.shorter=longer时。也就是说长短木板长度相同,即只给了一种长度的木板和需要该木板的数量,那么结果sum=shorter*k
即可(或者sum=longer*k
)。
代码:
(这里放的是本地编译器测试代码)
# leetcode面试题16.11跳水版 2020.07.08
class Solution(object):
def divingBoard(self, shorter, longer, k):
"""
:type shorter: int
:type longer: int
:type k: int
:rtype: List[int]
"""
short = -1 #短木板的数量 初始化-1是为了while中+=1
lon = 0 #长木板的数量
ls = [] #存储结果的列表
i = 0 #循环基数标志
if k==0: #如果k为0 则表示无解 返回空列表
return ls
else: #如果k不为0
if shorter==longer: #长短木板长度相同 则只需返回一组结果
sum = shorter*k #结果=短木板长度/长木板长度 * 数量k
ls.append(sum) #将计算出的结果插入列表
return ls #最后返回列表
else: #长短木板长度不一
while i<=k: #循环k+1次 用i标记
short = short + 1 #短木板数每次循环+1
lon = k - short #长木板数=总数-短木板数
sum = 0 #结果初始化为0
sum = shorter*short + longer*lon #结果=短木板长度*数量+长木板长度*数量
ls.insert(0,sum) #将计算出的结果插入列表头,以确保从小到大
i+=1 #循环标记
return ls #最后返回列表
# shorter = 1
# longer = 2
# k = 3
#结果[3,4,5,6]
# shorter = 1
# longer = 1
# k = 0
#结果[]
shorter = 1
longer = 1
k = 10000
# 结果[10000]
print(Solution().divingBoard(shorter,longer,k))