LeetCode——794.有效井字游戏

通过万岁!!!

  • 题目:就是给你一个字符串,然后其内容是一盘棋。判断这个棋盘能不能在显示中出现,棋子是X和O,没有下棋的地方就是空格,X先下。如果一方赢了,那就不用下了。
  • 思路:先看看X和O的个数对不对,如果不对的话,就直接返回false。如果都没有问题的话,再判断输赢的情况,例如"XXX"," ","OOO"这就是不可能的,因为X先下,X下到最后一个的时候,X已经赢了所以O不会下第三个棋子。
  • 技巧:理清楚思路即可
    • 如果X赢了,那么X的棋子个数一定是等于O的个数+1。如果是O赢,那么X的个数一定等于O。
    • 其次就是判断谁赢的时候,这里是一个多重if判断,但是只要有一个成立了,那么就没必要判断了。所以采用一个do{}while()循环。并且记录谁赢了。

伪代码

两次for循环记录X和O的个数
如果O的个数>X的个数 return false;
如果X比O多两个也是return false;
判断是不是有输赢
如果有则判断 X赢的时候,或者O赢的时候棋子数对不对
如果没有输赢,则return true即可。

java代码

class Solution {
    public boolean validTicTacToe(String[] board) {
        int o = 0, x = 0;
        Map<Character, String> map = new HashMap();
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                if (board[i].charAt(j) == 'O')
                    o++;
                else if (board[i].charAt(j) == 'X')
                    x++;
        if (o > x || x > o + 1) return false;
        if (o < 3) return true;// 这时候不用判断胜负
        // 判断胜负,X胜利,那么x-o==1,如果是o胜利,那么x==o
        char temp = 'A';
        do {
            if ((board[0].charAt(0) == board[1].charAt(0) && board[0].charAt(0) == board[2].charAt(0))) {// 第1列
                temp = board[0].charAt(0);
                break;
            }
            if ((board[0].charAt(1) == board[1].charAt(1) && board[0].charAt(1) == board[2].charAt(1))) {// 第2列
                temp = board[0].charAt(1);
                break;
            }
            if ((board[0].charAt(2) == board[1].charAt(2) && board[0].charAt(2) == board[2].charAt(2))) {// 第3列
                temp = board[0].charAt(2);
                break;
            }
            if ((board[0].equals("XXX") || board[0].equals("OOO"))) {// 第1行
                temp = board[0].charAt(0);
                break;
            }
            if ((board[1].equals("XXX") || board[1].equals("OOO"))) {// 第2行
                temp = board[1].charAt(0);
                break;
            }
            if ((board[2].equals("XXX") || board[2].equals("OOO"))) {// 第3行
                temp = board[2].charAt(0);
                break;
            }
            if ((board[0].charAt(0) == board[1].charAt(1) && board[0].charAt(0) == board[2].charAt(2))) {// 主对角线
                temp = board[0].charAt(0);
                break;
            }
            if ((board[0].charAt(2) == board[1].charAt(1) && board[0].charAt(2) == board[2].charAt(0))) {// 副对角线
                temp = board[0].charAt(2);
                break;
            }
        } while (false);
        if (temp != 'A') {// 有胜负
            return temp == 'X' ? (x == o + 1 ? true : false) : (x == o ? true : false);
        } else {// 无胜负
            return true;
        }
    }
}
  • 总结:这里面有一个技巧,或者说代码的规范,就是用do while+if代替个if进行或的情况。并且这个题目必须要这样做,因为还要记录是谁赢了。

你可能感兴趣的:(算法,leetcode,算法,java)