通过万岁!!!
- 题目:就是给你一个字符串,然后其内容是一盘棋。判断这个棋盘能不能在显示中出现,棋子是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进行或的情况。并且这个题目必须要这样做,因为还要记录是谁赢了。