来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state/
一,问题描述
例子:
1.1 解释
这道题目是一道纯粹的模拟题,感觉可能不是一道算法题目。而是为了出题目而出题目。看到题目,我一直没有看懂。根据题目信息,发现(永远是第一个玩家先下棋) 可以提取到题干信息是:
- 棋盘中
X 的数目永远是比O 多一,或者是相等。 - 如果是
X 赢,那么X 的数目会比O 多一,如果是O 赢,则O 的数目会和X 的相等。
如果是满足上面的两个条件,才有可能达到所给的棋盘状态,最后,不可能会同时出现两个都有三个的情况。
可以写出代码如下:
二,题解
public boolean check(char[][] board, char ch){
if(board[0][0] == ch && board[1][1] == ch && board[2][2] == ch) return true;
if(board[0][2] == ch && board[1][1] == ch && board[2][0] == ch) return true;
for(int i = 0; i < board.length; i++){
if(board[i][0] == ch && board[i][1] == ch && board[i][2] == ch) return true;
if(board[0][i] == ch && board[1][i] == ch && board[2][i] == ch) return true;
}
return false;
}
public boolean validTicTacToe(String[] board) {
int a = 0, b = 0;
char[][] chars = new char[3][3];
for (int i = 0; i < chars.length; i++) {
chars[i] = board[i].toCharArray();
}
for (char[] aChar : chars) {
for (char c : aChar) {
if(c == 'X') a++;
else if(c == 'O') b++;
}
}
if(a < b || a > b + 1) return false;
if(check(chars, 'X') && a != b + 1) return false;
if(check(chars, 'O') && a != b) return false;
return true;
}
三,复杂度分析
时间:时间复杂度O(N*N)
空间:空间复杂度O(1)
总结
模拟器信息的打磨题目,可以提取有用信息,从而最后解出最后的解,
【参考】 https://www.cnblogs.com/zhangshihang/p/15668028.html
|