版权声明:博客仅供参考,有什么意见,请在下方留言,转载时请附上链接,谢谢! https://blog.csdn.net/u010105243/article/details/83118839
下面回顾一下前两天面试过程中,做的一到笔试题:
题目:计算24 点,输入4 个整数,如何计算得到24,输出所有可能的计算方式; 若不能计算得到则输出None。
解题思路:由于不考虑顺序, 括号的位置可以认为有两种[(a, b, c) d ]; [(a,b), (c,d)],然后递归地遍历所有的情况。里面有两个小点:
(1) a+b和b+a的情况一样,可以去掉一部分的计算
(2) 主函数中考虑到浮点计算,中间有一个判断。
代码如下:
#!/usr/bin/python
from __future__ import division
#Author: Marlin
#Time: 2018-10-15
def permutation(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i + 1]
if n == 1:
yield v
else:
rest = items[:i] + items[i + 1:]
for p in permutation(rest, n - 1):
yield v + p
def F(a, b):
arr = []
for i in a:
for j in b:
arr.append("(" + i + "+" + j + ")")
arr.append("(" + i + "-" + j + ")")
arr.append("(" + j + "-" + i + ")")
arr.append("(" + i + "*" + j + ")")
eval(j) != 0 and arr.append("(" + i + "/" + j + ")")
eval(i) != 0 and arr.append("(" + j + "/" + i + ")")
return arr
def main(arr):
vaild_exprs = []
for lst in permutation(arr):
a_expr = F(F(F([lst[0]], [lst[1]]), [lst[2]]), [lst[3]])
b_expr = F(F([lst[0]], [lst[1]]), F([lst[2]], [lst[3]]))
all_expr = a_expr + b_expr
for expr in all_expr:
if abs(eval(expr) - 24) < 0.0001:
vaild_exprs.append(expr)
print(expr)
print('None' if len(vaild_exprs) == 0 else 'Total:{}'.format(len(vaild_exprs)))
if __name__ == '__main__':
# sample = [3, -12, 3, 0]
# sample = [3, -12, 7, 1]
sample = [1, 7, 3, 8]
arr = [str(i) if i >= 0 else '('+str(i)+')' for i in sample ]
main(arr)
代码仅供内部交流