Skip to content

Commit 5be1437

Browse files
authored
Update Design Tic-Tac-Toe.java
1 parent 6e3b0d0 commit 5be1437

File tree

1 file changed

+34
-50
lines changed

1 file changed

+34
-50
lines changed

Medium/Design Tic-Tac-Toe.java

Lines changed: 34 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,50 @@
11
class TicTacToe {
22

3-
/** Initialize your data structure here. */
4-
int[][] board;
5-
Map<Integer, Map<Integer, Integer>> rowMap;
6-
Map<Integer, Map<Integer, Integer>> colMap;
7-
Map<Integer, Integer> leftDiagonalMap;
8-
Map<Integer, Integer> rightDiagonalMap;
9-
int n;
3+
private int n;
4+
private Map<Integer, Map<Integer, Integer>> rowMapping;
5+
private Map<Integer, Map<Integer, Integer>> colMapping;
6+
private Map<Integer, Map<Integer, Integer>> diagonalMapping;
7+
8+
private final int LEFT_DIAGONAL = 1;
9+
private final int RIGHT_DIAGONAL = -1;
10+
1011
public TicTacToe(int n) {
11-
board = new int[n][n];
12-
rowMap = new HashMap<>();
13-
colMap = new HashMap<>();
14-
leftDiagonalMap = new HashMap<>();
15-
rightDiagonalMap = new HashMap<>();
1612
this.n = n;
13+
this.rowMapping = new HashMap<>();
14+
this.colMapping = new HashMap<>();
15+
this.diagonalMapping = new HashMap<>();
16+
this.diagonalMapping.put(LEFT_DIAGONAL, new HashMap<>());
17+
this.diagonalMapping.put(RIGHT_DIAGONAL, new HashMap<>());
1718
}
1819

19-
/** Player {player} makes a move at ({row}, {col}).
20-
@param row The row of the board.
21-
@param col The column of the board.
22-
@param player The player, can be either 1 or 2.
23-
@return The current winning condition, can be either:
24-
0: No one wins.
25-
1: Player 1 wins.
26-
2: Player 2 wins. */
2720
public int move(int row, int col, int player) {
28-
if (!rowMap.containsKey(row)) {
29-
Map<Integer, Integer> map = new HashMap<>();
30-
rowMap.put(row, map);
31-
}
32-
rowMap.get(row).put(player, rowMap.get(row).getOrDefault(player, 0) + 1);
33-
if (ifWinner(rowMap.get(row), player)) {
34-
return player;
35-
}
36-
if (!colMap.containsKey(col)) {
37-
Map<Integer, Integer> map = new HashMap<>();
38-
colMap.put(col, map);
39-
}
40-
colMap.get(col).put(player, colMap.get(col).getOrDefault(player, 0) + 1);
41-
if (ifWinner(colMap.get(col), player)) {
42-
return player;
43-
}
44-
if (row == col) {
45-
leftDiagonalMap.put(player, leftDiagonalMap.getOrDefault(player, 0) + 1);
46-
}
47-
if (ifWinner(leftDiagonalMap, player)) {
48-
return player;
49-
}
50-
if (row + col == n - 1) {
51-
rightDiagonalMap.put(player, rightDiagonalMap.getOrDefault(player, 0) + 1);
52-
}
53-
if (ifWinner(rightDiagonalMap, player)) {
21+
recordMove(row, col, player);
22+
if (isWinnerFound(row, col, player)) {
5423
return player;
5524
}
5625
return 0;
5726
}
5827

59-
private boolean ifWinner(Map<Integer, Integer> map, int player) {
60-
if (map.size() > 1) {
61-
return false;
28+
private void recordMove(int row, int col, int player) {
29+
this.rowMapping.computeIfAbsent(row, k -> new HashMap<>());
30+
this.colMapping.computeIfAbsent(col, k -> new HashMap<>());
31+
this.rowMapping.get(row).put(player, this.rowMapping.get(row).getOrDefault(player, 0) + 1);
32+
this.colMapping.get(col).put(player, this.colMapping.get(col).getOrDefault(player, 0) + 1);
33+
if (row == col) {
34+
this.diagonalMapping.get(LEFT_DIAGONAL)
35+
.put(player, this.diagonalMapping.get(LEFT_DIAGONAL).getOrDefault(player, 0) + 1);
36+
}
37+
if (row + col + 1 == this.n) {
38+
this.diagonalMapping.get(RIGHT_DIAGONAL)
39+
.put(player, this.diagonalMapping.get(RIGHT_DIAGONAL).getOrDefault(player, 0) + 1);
6240
}
63-
return map.values().stream().reduce(0, Integer::sum) == n;
41+
}
42+
43+
private boolean isWinnerFound(int row, int col, int player) {
44+
return this.rowMapping.get(row).get(player) == this.n ||
45+
this.colMapping.get(col).get(player) == this.n ||
46+
this.diagonalMapping.get(LEFT_DIAGONAL).getOrDefault(player, 0) == this.n ||
47+
this.diagonalMapping.get(RIGHT_DIAGONAL).getOrDefault(player, 0) == this.n;
6448
}
6549
}
6650

0 commit comments

Comments
 (0)