推销别人做网站有什么作用合肥网站关键词优化公司
通过万岁!!!
- 题目:就是给你一个字符串,然后其内容是一盘棋。判断这个棋盘能不能在显示中出现,棋子是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==ochar 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进行或的情况。并且这个题目必须要这样做,因为还要记录是谁赢了。