【问题标题】:Why can't I use max with Python to find maximum one-digit integer in array?为什么我不能在 Python 中使用 max 来查找数组中的最大一位整数?
【发布时间】:2021-09-16 01:19:35
【问题描述】:

我最近有一次面试,被要求用 Python 解决以下问题:

写一个函数:

def solution(A):

这样,给定一个由 N 个整数组成的数组A,它返回所有一位整数中的最大值。

例如,给定数组A如下:

[-6, -91, 1011, -100, 84, -22, 0, 1, 473]

函数应该返回 1。

假设:

  • N 是 [1...1,000] 范围内的整数
  • 数组A 的每个元素都是[-10,000..10,000] 范围内的整数。
  • 数组A中至少有一个元素满足任务语句中的条件。

我想出了以下我认为很优雅的解决方案,但我得到的分数只有 55%:

def solution(A):
    return max([i for i in A if len(str(i))==1])

为什么这个解决方案不正确?

【问题讨论】:

  • -6 是一位数。但是len(str(-6))2
  • 另外,任何告诉你调用 Python 局部变量 capital A 的面试问题肯定是由实际上不使用 Python 的人编写的。
  • 同样将整数转换为字符串也不是那么优雅。你可以使用if -9 <= i <= 9
  • @ZhubeiFederer 不是最初的评论者,但在我看来不仅这种糟糕的风格(本质上是非描述性的)而且以大写字母开头的变量在风格上是为类名保留的。
  • @ZhubeiFederer - 根据 pep8,局部变量应该是 lower_case_with_underscores 并且它们应该是描述性的。 A 也不是。

标签: python max


【解决方案1】:

不是最优雅的。这假设例如-3 是个位数。

该算法将按照规则集进行。考虑约束:

  • 数字是-10,000到10,000
  • 至少一个元素满足条件

然后我们可以将所有超过 9 的数字保护为最低的 -10,001,这样它们就不会被认为是最大的。我们不需要关心低于 -9 的数字,因为我们确信至少有 1 个元素(即单个数字,无论是正数还是负数,都大于那些低于 -9 的数字)满足条件.

print(
    max(
        [-6, -91, 1011, -100, 84, -22, 0, 1, 473, 5, 4, 67, 7, 3, 56],
        key=lambda num: -10001 if num > 9 else num
    )
)
print(
    max(
        [-6, -91, 1011, -100, 84, -22, 10, -5, -8, 67],
        key=lambda num: -10001 if num > 9 else num
    )
)

输出:

7
-5

【讨论】:

  • 好主意。你也可以简单地使用max(i for i in a if i < 10)
  • 我没想到!是的,确实,这是符合规则的更好(如果不是最好的话)版本:)
【解决方案2】:

这是一个在我的书中打勾的解决方案。

def solution(integers):
    """Return max single digit integer in sequence `integers`"""
    try:
        return max(i for i in integers if -9 <= i <= 9)
    except ValueError:
        return ValueError("Could not find single digit integer in list")

print(solution([-6, -91, 1011, -100, 84, -22, 0, 1, 473]))

它使用描述性参数名称,有注释,对数字大小进行简单比较,并使用带有内置函数 max 的生成器而不是不必要的列表。它还通过更热门的错误消息重新引发最预期的错误。该功能更易于维护和使用。

【讨论】:

  • 这是我的逻辑,尽管正如 Selcuk 指出的那样,max(i for i in a if i &lt; 10) 是一种更简洁的方法。
  • 这不适用于大的负数。你的意思是abs(i)?那是我最初的解决方案,但我在比较快的不稳定假设下改为比较。
  • 为什么它不适用于大的负数?请提供一个无法使用的数组示例?
  • @sprogissd [-11, 33] 会将 -11 报告为 1 位数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2015-02-18
  • 1970-01-01
相关资源
最近更新 更多