【20190828】【校招笔试题】算式转移_滴滴

问题

【20190828】【校招笔试题】算式转移_滴滴_第1张图片【20190828】【校招笔试题】算式转移_滴滴_第2张图片


思路及代码

# 巧妙地运用回溯法!!! 
# 参考的别人来写的
# n = 8
# s = ['3','+', '2', '+', '1', '-', '4', '-', '2', '/', '3', '/', '2', '*', '4']
n = int(input())
s = list(input().split())    # 输入的都是字符串的形式(包括数字也是字符的形式)
for i in range(len(s)):
    if s[i] in ['+', '-', '*', '/']:   # 这里对 i 的限制是为了保证后面的 [j+1] 和 [j-1] 都是数值
        new_s = s[:]
        for j in range(i, 0, -2):
            if new_s[j + 1] < new_s[j - 1]:
                new_s[j + 1], new_s[j - 1] = new_s[j - 1], new_s[j + 1]
            else:     # 这里不能少,因为前面的已经在之前步骤检查过了,因此如果不满足就退出就好了,否则会出错!
                break
            if eval(" ". join(new_s)) == eval(" ".join(s)):
                s = new_s
            # else:      # 这里好像有没有都可以
            #     break
print(" ".join(s))



################# 参考代码 ################
# 牛客网上看到的,很佩服!学习一下!
# n=int(input())
# s=list(input().split(" "))
# for i in range(len(s)):       # 这里好像没用到
#     if s[i] in ['+','-','*','/']:
#         j = i
#         break
# for i in range(len(s)):
#     if s[i] in ['+','-','*','/']:
#         new_s = s[:]
#         for j in range(i, 0, -2):
#             if int(new_s[j+1]) > int(new_s[j-1]):
#                 break
#             # t = new_s[j+1]
#             # new_s[j+1] = new_s[j-1]
#             # new_s[j-1] = t
#             new_s[j+1], new_s[j-1] = new_s[j-1], new_s[j+1]
#             if eval("".join(new_s)) == eval("".join(s)):
#                 s = new_s[:]
#             else:
#                 break
# print(" ".join(s))

其他思路的代码参考:

https://www.nowcoder.com/discuss/235697

https://www.nowcoder.com/discuss/235938?type=post&order=time&pos=&page=1 


知识点

1. 系统输入的都是字符串的形式,运用 list 转化成列表形式,运用 eval 将字符转化成 数字,如果是式子的话,那么 eval 可以执行出结果。

2. "sep".join(s) 的使用,用 sep 来分隔 s 字符串。

3. 经典的回溯法的使用!

你可能感兴趣的:(校招笔试)