-
Notifications
You must be signed in to change notification settings - Fork 820
/
BattleshipsInABoard.java
55 lines (53 loc) · 2.06 KB
/
BattleshipsInABoard.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* (C) 2024 YourCompanyName */
package array;
/**
* Created by gouthamvidyapradhan on 12/08/2017. Given an 2D board, count how many battleships are
* in it. The battleships are represented with 'X's, empty slots are represented with '.'s. You may
* assume the following rules:
*
* <p>You receive a valid board, made of only battleships or empty slots. Battleships can only be
* placed horizontally or vertically. In other words, they can only be made of the shape 1xN (1 row,
* N columns) or Nx1 (N rows, 1 column), where N can be of any size. At least one horizontal or
* vertical cell separates between two battleships - there are no adjacent battleships. Example:
* X..X ...X ...X In the above board there are 2 battleships. Invalid Example: ...X XXXX ...X This
* is an invalid board that you will not receive - as battleships will always have a cell separating
* between them.
*
* <p>Follow up: Could you do it in one-pass, using only O(1) extra memory and without modifying the
* value of the board?
*
* <p>Solution: The below solution works in one pass using only O(1) memory. Iterate through each
* cell and add one to count if and only if the current cell equals 'X' and its adjacent upper and
* left cell does not contain 'X'
*/
public class BattleshipsInABoard {
/**
* Main method
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
char[][] board = {{'X', '.', '.', 'X'}, {'.', '.', '.', 'X'}, {'.', '.', '.', 'X'}};
System.out.println(new BattleshipsInABoard().countBattleships(board));
}
public int countBattleships(char[][] board) {
int count = 0;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == 'X') {
if (i - 1 >= 0) { // check for the boundary condition
if (board[i - 1][j] == 'X') continue;
}
if (j - 1 >= 0) {
if (board[i][j - 1] == 'X') {
continue;
}
}
count++;
}
}
}
return count;
}
}