Python程序检查能否通过插入运算符得到24


假设我们有一个包含四个数字的列表,每个数字都在 1 到 9 的范围内,并且按照固定的顺序排列。现在,如果我们在这些数字之间放置运算符 +、-、* 和 /(/ 表示整数除法),并用括号对它们进行分组,我们必须检查是否可以得到值 24。

因此,如果输入类似于 nums = [5, 3, 6, 8, 7],则输出将为 True,因为 (5 * 3) - 6 + (8 + 7) = 24。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数 recur()。它将接收 arr 作为输入。
  • answer := 一个新的列表
  • 对于范围从 0 到 arr 大小 - 1 的 i,执行以下操作:
    • pre := recur(arr[从索引 0 到 i])
    • suf := recur(arr[从索引 i + 1 到结尾])
    • 对于 pre 中的每个 k,执行以下操作:
      • 对于 suf 中的每个 j,执行以下操作:
        • 在 answer 的末尾插入 (k + j)
        • 在 answer 的末尾插入 (k - j)
        • 在 answer 的末尾插入 (k * j)
        • 如果 j 不为 0,则
          • 在 answer 的末尾插入 (k / j 的商)
  • 如果 answer 的大小为 0 且 arr 的大小为 1,则
    • 在 answer 的末尾插入 arr[0]
  • 返回 answer
  • 在主方法中检查 24 是否在 recur(nums) 中,如果是,则返回 True,否则返回 False。

让我们看看以下实现以更好地理解:

示例

在线演示

class Solution:
   def solve(self, nums):
      def recur(arr):
         answer = []
         for i in range(len(arr) - 1):
            pre, suf = recur(arr[: i + 1]), recur(arr[i + 1 :])
            for k in pre:
               for j in suf:
                  answer.append(k + j)
                  answer.append(k - j)
                  answer.append(k * j)
                  if j != 0:
                     answer.append(k // j)
         if len(answer) == 0 and len(arr) == 1:
            answer.append(arr[0])
         return answer
      return 24 in recur(nums)
ob = Solution()
nums = [5, 3, 6, 8, 7]
print(ob.solve(nums))

输入

[5, 3, 6, 8, 7]

输出

True

更新于: 2020-12-02

79 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告