根据规则将箱子分类

标签: 数学

难度: Easy

给你四个整数 length ,width ,height 和 mass ,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。

  • 如果满足以下条件,那么箱子是 "Bulky" 的:
    • 箱子 至少有一个 维度大于等于 104 。
    • 或者箱子的 体积 大于等于 109 。
  • 如果箱子的质量大于等于 100 ,那么箱子是 "Heavy" 的。
  • 如果箱子同时是 "Bulky" 和 "Heavy" ,那么返回类别为 "Both" 。
  • 如果箱子既不是 "Bulky" ,也不是 "Heavy" ,那么返回类别为 "Neither" 。
  • 如果箱子是 "Bulky" 但不是 "Heavy" ,那么返回类别为 "Bulky" 。
  • 如果箱子是 "Heavy" 但不是 "Bulky" ,那么返回类别为 "Heavy" 。

注意,箱子的体积等于箱子的长度、宽度和高度的乘积。

示例 1:

输入:length = 1000, width = 35, height = 700, mass = 300
输出:"Heavy"
解释:
箱子没有任何维度大于等于 104 。
体积为 24500000 <= 109 。所以不能归类为 "Bulky" 。
但是质量 >= 100 ,所以箱子是 "Heavy" 的。
由于箱子不是 "Bulky" 但是是 "Heavy" ,所以我们返回 "Heavy" 。

示例 2:

输入:length = 200, width = 50, height = 800, mass = 50
输出:"Neither"
解释:
箱子没有任何维度大于等于 104 。
体积为 8 * 106 <= 109 。所以不能归类为 "Bulky" 。
质量小于 100 ,所以不能归类为 "Heavy" 。
由于不属于上述两者任何一类,所以我们返回 "Neither" 。

提示:

  • 1 <= length, width, height <= 105
  • 1 <= mass <= 103

Submission

运行时间: 22 ms

内存: 16.0 MB

class Solution:
    def categorizeBox(self, length: int, width: int, height: int, mass: int) -> str:
        v = length*width*height
        max_val = max(length,width,height)
        isbulky=max_val>=10000 or v >= 10**9
        isheavy=mass >=100
        if isheavy and isbulky:
            return 'Both'
        if isbulky:
            return 'Bulky'
        if isheavy:
            return 'Heavy'
        return 'Neither' 

Explain

首先,计算箱子的体积和最大维度。接着,根据题目条件判断箱子是否是'Bulky'(至少一个维度大于等于104或体积大于等于109)。再检查箱子的质量是否大于等于100,从而判断是否是'Heavy'。最后,根据箱子是否满足'Bulky'和'Heavy'的条件,返回相应的分类字符串。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def categorizeBox(self, length: int, width: int, height: int, mass: int) -> str:
        # 计算箱子的体积
        v = length * width * height
        # 找到三个维度中的最大值
        max_val = max(length, width, height)
        # 判断箱子是否满足'Bulky'的条件
        isbulky = max_val >= 10000 or v >= 10**9
        # 判断箱子是否满足'Heavy'的条件
        isheavy = mass >= 100
        # 根据'Bulky'和'Heavy'的判断结果,返回相应的类别
        if isheavy and isbulky:
            return 'Both'
        if isbulky:
            return 'Bulky'
        if isheavy:
            return 'Heavy'
        return 'Neither' 

Explore

在算法描述中,提到维度大于等于10000是一个错误或者是一个笔误。实际的条件应该是维度大于等于104,这可能是10000(也就是10的4次方)的错误表达方式。这一点需要更正以避免混淆。

代码中没有显式地处理体积计算可能导致的整数溢出问题。在Python中,整数类型可以自动处理非常大的数,但在其他编程语言中,如Java或C++,这可能导致整数溢出。如果在其他语言中实现,需要使用能够处理更大整数范围的数据类型,或者在计算前进行检查以避免溢出。

这种顺序的考虑是为了优化算法的效率和逻辑清晰性。首先检查同时满足'Bulky'和'Heavy'可以直接返回结果'Both',这样可以避免进行不必要的进一步判断。这样的顺序可以减少执行判断的次数,特别是在多个条件同时成立的情况下,提高代码效率。

如果输入的维度或质量是负数,按照当前算法的逻辑,它将不会正确地分类箱子,因为负数在物理意义上不合理。算法应该在处理输入之前添加检查以确保所有输入(长度、宽度、高度和质量)都是非负的。如果发现任何负数输入,应该抛出错误或返回一个特定的错误消息,表明输入数据无效。