27、甲板上的战舰
题目描述:
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X’表示,空位用 '.'表示。 你需要遵守以下规则:
给你一个有效的甲板,仅由战舰或者空位组成。
战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。
两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。
进阶:
你可以用一次扫描算法,只使用O(1)额外空间,并且不修改甲板的值来解决这个问题吗?
思路:首先这道题有点懵人,感觉很无厘头,但是当你拿到第一个案例时
即
X…X
…X
…X
我的分析:
战舰之间如果相邻那么只能算是一个战舰,比如如最后一列的三个X,就是一列,第一个X就是第一个战舰,那么这样就很明确了,如果右边或者下边有X那么就是一个,否则该X就是一个新的战舰,要注意的是如果是边界那么只要判断一边即可(下边或者是右边是’.'即可)
代码:
class Solution {
public int countBattleships(char[][] board) {
int count = 0;
//行
int row = board.length;
//列
int column = board[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
if(board[i][j] == 'X'){
//右边和下边都没有
if(i == row - 1 || board[i + 1][j] == '.'){
if(j == column - 1 || board[i][j + 1] == '.'){
count ++;
}
}
}
}
}
return count;
}
}
排名靠前的代码
讲真的,这个代码还是有点复杂
class Solution {
public int countBattleships(char[][] board) {
if(board == null || board.length == 0){
return 0;
}
int rows = board.length;
int cols = board[0].length;
int count = 0;
boolean leftSet = false;
for(int row = 0; row < rows; row++) {
leftSet = false;
for(int col = 0; col < cols; col++) {
if(board[row][col] == 'X') {
if(row == 0) {
if(!leftSet) count++;
} else {
if(board[row - 1][col] == '.' && !leftSet) count++;
}
leftSet = true;
} else {
leftSet = false;
}
}
}
return count;
}
}