面试题16.11跳水板——力扣算法系列2020.07.08 Python

第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))

面试题16.11跳水板——力扣算法系列2020.07.08 Python_第1张图片

你可能感兴趣的:(算法,python,leetcode)