Java 中的翻牌游戏

2025年6月19日 | 阅读 4 分钟

开发者经常使用翻牌游戏来展示他们的编程实力。本文将讨论在 Java 中开发翻牌游戏。我们将讨论几种策略,并提供带有解释的全面代码示例。

问题陈述

长度为 n 的两个 0 索引整数数组 fronts 和 backs 分别在正面写有正整数 fronts[i],在背面写有 backs[i]。每张牌最初都放在桌子上,正面朝上,背面朝下。你可以翻转任意数量的牌(可能一张也不翻)。

翻牌后,如果一个整数出现在一张背面朝上的牌上,且不在任何其他牌上,则该整数被认为是“好”的。

翻牌后,返回可以计算出的最小的“好”整数。如果没有合适的整数,则返回 0。

输入: fronts = [1,2,4,4,7], backs = [1,3,4,1,3]

输出 2

方法 1

CardFlipping 类包含一个静态方法 flipgame,该方法接受两个数组 fronts 和 backs 作为参数。此方法计算翻牌后可以显示一张正面和背面值不同的牌所需的最小数字。

实施

创建两个集合:both 和 either。both 集合将存储 fronts 和 backs 数组中相同的值,either 集合将存储来自两个数组的所有唯一值。

使用循环遍历 fronts 和 backs 数组。对于每个索引 i,执行以下检查:

  • 如果 fronts[i] 的值等于 backs[i] 的值,则表示这张牌两面的值相同。将该值添加到 both 集合中。
  • 否则,将 fronts[i] 和 backs[i] 的值都添加到 either 集合中。
  • 遍历完所有牌后,我们就确定了背面值相同的牌(both 集合)以及来自两个数组的所有唯一牌(either 集合)。
  • 遍历 either 集合,检查每个值是否存在于 both 集合中。如果一个值不存在于 both 集合中,则表示翻转该牌将显示一个不同的值。返回此值作为所需的最小翻牌次数。
  • 如果所有唯一牌的两面值都相同,或者 either 集合为空,则返回 0,表示不需要翻牌。

在 main() 方法中,使用包含牌值的 fronts 和 backs 数组创建了一个示例场景。使用这些数组调用 flipgame 方法,并将结果打印到控制台。

在提供的示例场景中,fronts 数组的值为 {1,2,4,4,7},backs 数组的值为 {1,3,4,1,3}。预期输出为 2,这意味着至少翻转两张牌将显示两面不同的值。

总体而言,flipgame 方法有效地确定了找到正面和背面值不同的牌所需的最小翻牌次数。

文件名: CardFlipping.java

输出

2

方法 2

  • 如果一张牌的正面和背面都刻有数字 K,那么 K 就不能是答案,因为无论这张牌翻多少次,答案都将保持不变。
  • 无论数字 K 在正面数组中出现多少次,只需翻转所有牌,确保不再有正面刻有 K 的牌。然后,我们可以选择任何一张牌(最小的),它背面刻有 K,它就是答案。
  • 现在的问题归结为找到所有数字 K1, K2,..., Kn,使得它们在任何牌上都不重复,然后确定 K1, K2,..., Kn 背面上所有数字中的最小值。
  • 如果无法达到结果,则打印 0。

CardFlipping.java

输出

2