给定N张卡片,每张卡片的正面和背面均印有正整数(可能不同)。可以翻转任意数量的卡,然后从卡组中选择一张卡。如果所选卡片背面的数字X不在任何卡片的正面,那么我们说数字X很好。任务是找到最合适的最小编号。如果没有数字好,则打印0 。
注意:翻页会交换卡上的正反数字,即正反面现在是正面的值,反之亦然。
例子:
Input: fronts = [1, 2, 4, 4, 7, 8], backs = [1, 3, 4, 1, 3, 9]
Output: 2
If we flip the second card, the fronts are [1, 3, 4, 4, 7, 8] and the backs are [1, 2, 4, 1, 3, 9].
Now, we choose the second card, having number 2 on the back, and it isn’t on the front of any other card, so 2 is good.
Input: fronts = [1, 2, 3, 4, 5], backs = [6, 7, 8, 9, 10]
Output: 1
方法:
- 如果一张纸牌的正面和背面写有相同的值K ,那么无论您翻动这张卡多少次,结果都将是相同的,因此K不能成为答案。
- 正面和背面写有不同数字的所有其他卡都可以作为答案的候选者,无论在
front
阵列中数字K重复多少次,只需翻转所有卡,就不会再有写有K的卡了在正面,那么我们可以简单地选择任何背面写有K的卡片(最少),这就是答案。 - 现在问题减少到找到所有数字K1,K2,…,Kn,这样它们就不会在任何卡上重复了,然后在写在K1,K2,…,Kn背面的所有数字中,找到最小值。
- 如果无法得到结果,则打印0 。
下面是上述方法的实现:
# Python3 iomplementation of the approach
import itertools
MAX = 9999
def flipgame(fronts, backs):
same = {k for i, k in enumerate(fronts) if k == backs[i]}
# Initialize answer to arbitrary value
ans = MAX
for k in itertools.chain(fronts, backs):
if k not in same:
ans = min(ans, k)
# Return final answer
return ans % MAX
# Driver Code
fronts = [1, 2, 4, 4, 7]
backs = [1, 3, 4, 1, 3]
print(flipgame(fronts, backs))
输出:
2