網易2017春招筆試真題編程題集合——9.塗棋盤


網易2017春招筆試真題編程題集合——9.塗棋盤

題目:

小易有一塊n*n的棋盤,棋盤的每一個格子都為黑色或者白色,小易現在要用他喜歡的紅色去塗畫棋盤。小易會找出棋盤中某一列中擁有相同顏色的最大的區域去塗畫,幫助小易算算他會塗畫多少個棋格。

原題地址在這里:牛客網

輸入描述:

  • 輸入數據包括n+1行:
  • 第一行為一個整數n(1 ≤ n ≤ 50),即棋盤的大小
  • 接下來的n行每行一個字符串表示第i行棋盤的顏色,’W’表示白色,’B’表示黑色

輸出描述:

輸出小易會塗畫的區域大小

輸入例子:

3
BWW
BBB
BWB

輸出例子

3

用java編寫,思路是這樣的:

1 使用java.util.Scanner接收控制台輸入
2 定義兩個變量int iw,ib和一個數組int[] maxs:

  • iw用於累加當前列 W 連續出現的次數
  • ib用於累加當前列 B 連續出現的次數
  • maxs 數組用於記錄每一列出現的擁有相同顏色的最大的區域(即在一列中出現 連續的相同顏色的單元格 的最大個數)
  • 遍歷(雙層循環)保存了W/B的二維數組,在內層循環里判斷當前 單元格 的值是 W 還是 B ,是 W 的話:
    • 先 讓負責記錄當前列中 W 連續出現次數的 iw 自增1
    • 后 判斷用於記錄當前列出現 “擁有相同顏色的最大的區域” 的 maxs[i]的值是否小於此時的 iw ,是則把 iw 的值賦給他,否則不改變他的值
    • 最后 讓負責記錄當前列中 B 連續出現次數的 ib 置為0,因為此時遇到了 W ,即 B 不連續了,被 W 打斷了
  • 遇到 B 也是同樣的操作:ib 自增1,判斷當前的 maxs[i] ,把 iw 置為0;
  • 注意在開始遍歷每一列前(外層循環內)要把 iw , ib ,maxs[i]置為0;

代碼

import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if (!(n >= 1 && n <= 50))
return;
in.nextLine();
char[][] res = new char[n][n];
for (int i = 0; i < n; i++) {
String str = in.nextLine();
for (int j = 0; j < n; j++) {
res[i][j] = str.charAt(j);
}
}

int iw = 0, ib = 0;
int[] maxs= new int[n];

for (int i = 0; i < n; i++) {
maxs[i] = 0;
iw = ib = 0;
for (int j = 0; j < n; j++) {
if (res[j][i] == 'W') {
iw++;
maxs[i] = iw > maxs[i] ? iw : maxs[i];
ib = 0;
} else {
ib++;
maxs[i] = ib > maxs[i] ? ib : maxs[i];
iw = 0;
}
}
}
Arrays.sort(maxs);
System.out.println(""+maxs[maxs.length - 1]);

}
}

提交運行 之后就會提示通過所有測試用例:
這里寫圖片描述

注意點:

  • 在使用 Scanner 接收控制台輸入時先調用了 int nextInt() 方法,程序運行到該句時會阻塞,等待控制台輸入並按回車,之后該方法就會返回輸入的 int 值,別忘了此時還有一個 回車符 沒有被解析,先要調用 String nextLine()回車符 消耗掉,否則在之后調用 String nextLine()獲取輸入的 W/B 時會出錯。
  • 調用Arrays類的void sort(int[] a)方法對 maxs數組進行排序(升序),輸出
    maxs[maxs.length - 1]即為所求。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com