LeetCode 题解工作台

有效的井字游戏

给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。 井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ' , 'X' 和 'O' 组成。字符 ' ' 代表一个空位。 以下是井字游戏的规则: 玩家轮流将字符放…

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 数组·matrix

bolt

答案摘要

我们先统计当前棋盘上 `'X'` 和 `'O'` 的数量,记为 和 。接下来,我们分情况讨论: - 如果 $x \neq o$ 且 $x - 1 \neq o$,则当前棋盘不可能是有效棋盘,返回 `false`。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 数组·matrix 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true

井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ''X''O' 组成。字符 ' ' 代表一个空位。

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(' ')中。
  • 玩家 1 总是放字符 'X' ,而玩家 2 总是放字符 'O'
  • 'X''O' 只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。

 

示例 1:

输入:board = ["O  ","   ","   "]
输出:false
解释:玩家 1 总是放字符 "X" 。

示例 2:

输入:board = ["XOX"," X ","   "]
输出:false
解释:玩家应该轮流放字符。

示例 3:

输入:board = ["XOX","O O","XOX"]
输出:true

 

提示:

  • board.length == 3
  • board[i].length == 3
  • board[i][j]'X''O'' '
lightbulb

解题思路

方法一:分类讨论

我们先统计当前棋盘上 'X''O' 的数量,记为 xxoo。接下来,我们分情况讨论:

  • 如果 xox \neq ox1ox - 1 \neq o,则当前棋盘不可能是有效棋盘,返回 false
  • 如果当前棋盘上玩家 1 获胜,但 x1ox-1 \neq o,则当前棋盘不可能是有效棋盘,返回 false
  • 如果当前棋盘上玩家 2 获胜,但 xox \neq o,则当前棋盘不可能是有效棋盘,返回 false
  • 其他情况下,当前棋盘是有效棋盘,返回 true

时间复杂度 O(C)O(C),空间复杂度 O(1)O(1)。其中 CC 是棋盘上的格子数。本题中 C=9C = 9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
    def validTicTacToe(self, board: List[str]) -> bool:
        def win(x):
            for i in range(3):
                if all(board[i][j] == x for j in range(3)):
                    return True
                if all(board[j][i] == x for j in range(3)):
                    return True
            if all(board[i][i] == x for i in range(3)):
                return True
            return all(board[i][2 - i] == x for i in range(3))

        x = sum(board[i][j] == 'X' for i in range(3) for j in range(3))
        o = sum(board[i][j] == 'O' for i in range(3) for j in range(3))
        if x != o and x - 1 != o:
            return False
        if win('X') and x - 1 != o:
            return False
        return not (win('O') and x != o)
speed

复杂度分析

指标
时间Depends on the final approach
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Can the candidate correctly identify when the board counts for 'X' and 'O' are invalid?

  • question_mark

    Is the candidate able to logically check for a valid winner without errors?

  • question_mark

    Does the candidate understand the alternating move sequence and its effect on validity?

warning

常见陷阱

外企场景
  • error

    Forgetting to account for the fact that 'X' always starts first.

  • error

    Overlooking the case where both players are declared winners simultaneously.

  • error

    Incorrectly counting moves, leading to an invalid board state.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Consider larger boards or different-sized Tic-Tac-Toe grids for extension of the problem.

  • arrow_right_alt

    Validate different sets of rules for non-standard Tic-Tac-Toe games.

  • arrow_right_alt

    Check for invalid inputs or malformed boards as an edge case.

help

常见问题

外企场景

有效的井字游戏题解:数组·matrix | LeetCode #794 中等