列表

详情


822. 翻转卡片游戏

在桌子上有 N 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样)。

我们可以先翻转任意张卡片,然后选择其中一张卡片。

如果选中的那张卡片背面的数字 X 与任意一张卡片的正面的数字都不同,那么这个数字是我们想要的数字。

哪个数是这些想要的数字中最小的数(找到这些数中的最小值)呢?如果没有一个数字符合要求的,输出 0。

其中, fronts[i] 和 backs[i] 分别代表第 i 张卡片的正面和背面的数字。

如果我们通过翻转卡片来交换正面与背面上的数,那么当初在正面的数就变成背面的数,背面的数就变成正面的数。

示例:

输入:fronts = [1,2,4,4,7], backs = [1,3,4,1,3]
输出:2
解释:假设我们翻转第二张卡片,那么在正面的数变成了 [1,3,4,4,7] , 背面的数变成了 [1,2,4,1,3]。
接着我们选择第二张卡片,因为现在该卡片的背面的数是 2,2 与任意卡片上正面的数都不同,所以 2 就是我们想要的数字。

 

提示:

  1. 1 <= fronts.length == backs.length <= 1000
  2. 1 <= fronts[i] <= 2000
  3. 1 <= backs[i] <= 2000

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int flipgame(vector<int>& fronts, vector<int>& backs) { } };

php 解法, 执行用时: 44 ms, 内存消耗: 19.3 MB, 提交时间: 2023-08-02 09:39:06

class Solution {

    /**
     * @param Integer[] $fronts
     * @param Integer[] $backs
     * @return Integer
     */
    function flipgame($fronts, $backs) {
        $same = [];
        for ($i = 0; $i < count($fronts); $i++) {
            if ( $fronts[$i] == $backs[$i])
                array_push($same, $fronts[$i]);
        }
        
        $ans = 9999;
        foreach ($fronts as $x) {
            if ( !in_array($x, $same) ) $ans = min($ans, $x);
        }

        foreach ( $backs as $x ) {
            if ( !in_array($x, $same) ) $ans = min($ans, $x);
        }

        return $ans % 9999;
    }
}

golang 解法, 执行用时: 16 ms, 内存消耗: 5.2 MB, 提交时间: 2023-03-09 17:53:45

func flipgame(fronts []int, backs []int) int {
    m := map[int]bool{}
    for i, x := range fronts {
        if x == backs[i] {
            m[x] = true
        }
    }
    ans := 9999
    for _, x := range fronts {
        if k := m[x]; !k {
            ans = min(ans, x)
        }
    }
    for _, x := range backs {
        if k := m[x]; !k {
            ans = min(ans, x)
        }
    }
    return ans % 9999
}

func min(x, y int) int { if x < y { return x }; return y }

javascript 解法, 执行用时: 64 ms, 内存消耗: 43.7 MB, 提交时间: 2023-03-09 17:47:56

/**
 * @param {number[]} fronts
 * @param {number[]} backs
 * @return {number}
 */
var flipgame = function(fronts, backs) {
    let set = new Set(); // 记录两面相同的数
    fronts.forEach((i,idx) => {
        if (i === backs[idx]) set.add(i);
    });
    let res = Infinity;
    for (let i of fronts) { // 选取剩下的最小的数
        if (!set.has(i)) res = Math.min(res, i);
    }
    for (let i of backs) {
        if (!set.has(i)) res = Math.min(res, i);
    }
    return res === Infinity ? 0 : res;
};

java 解法, 执行用时: 2 ms, 内存消耗: 41.4 MB, 提交时间: 2023-03-09 17:47:25

class Solution {
    public int flipgame(int[] fronts, int[] backs) {
        Set<Integer> same = new HashSet();
        for (int i = 0; i < fronts.length; ++i)
            if (fronts[i] == backs[i])
                same.add(fronts[i]);

        int ans = 9999;
        for (int x: fronts)
            if (!same.contains(x))
                ans = Math.min(ans, x);

        for (int x: backs)
            if (!same.contains(x))
                ans = Math.min(ans, x);

        return ans % 9999;
    }
}

python3 解法, 执行用时: 44 ms, 内存消耗: 15.1 MB, 提交时间: 2023-03-09 17:46:00

'''
记住所有在一张卡上出现两次的值same, 然后每个不在same中的x都可能是答案;
'''
class Solution(object):
    def flipgame(self, fronts, backs):
        same = {x for i, x in enumerate(fronts) if x == backs[i]} # 正反一样的数值
        ans = 9999
        for x in itertools.chain(fronts, backs):
            if x not in same:
                ans = min(ans, x)

        return ans % 9999

上一题