福到了
“福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每个汉字是由一个 N × N 的网格组成的,网格中的元素或者为字符 @ 或者为空格。而倒过来的汉字所用的字符由裁判指定。
输入格式:
输入在第一行中给出倒过来的汉字所用的字符、以及网格的规模 N (不超过100的正整数),其间以 1 个空格分隔;随后 N 行,每行给出 N 个字符,或者为 @ 或者为空格。
输出格式:
输出倒置的网格,如样例所示。但是,如果这个字正过来倒过去是一样的,就先输出bu yong dao le,然后再用输入指定的字符将其输出。
输入样例 1:
$ 9
@ @@@@@
@@@ @@@
@ @ @
@@@ @@@
@@@ @@@@@
@@@ @ @ @
@@@ @@@@@
@ @ @ @
@ @@@@@
输出样例 1:
$$$$$ $
$ $ $ $
$$$$$ $$$
$ $ $ $$$
$$$$$ $$$
$$$ $$$
$ $ $
$$$ $$$
$$$$$ $
输入样例 2:
& 3
@@@
@
@@@
输出样例 2:
bu yong dao le
&&&
&
&&&
代码
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split(" ");
char s = arr[0].charAt(0);
int n = Integer.parseInt(arr[1]);
String str; //每行输入的字符串
StringBuilder[] sb = new StringBuilder[n]; //反转后的字符串数组
for(int i = 0; i < n; ++i) {
str = br.readLine();
char c = 0;
for(int j = 0; j < str.length(); ++j) {
if(str.charAt(j) != ' ') {
c = str.charAt(j);
break;
}
}
str = str.replace(c, s); //将旧字符用新字符替换掉
sb[i] = new StringBuilder(str).reverse(); //字符串反转
}
boolean flag = false;
for(int i = 0; i < n / 2; ++i) {
//判断是否上下对称
if(!sb[i].toString().equals(sb[n - i -1].toString())) {
flag = true;
break;
}
}
if(!flag) {
System.out.println("bu yong dao le");
}
for(int i = n - 1; i >= 0; --i) {
System.out.println(sb[i]);
}
}
}
【注】
①使用replace()函数是返回一个替换后的字符串,而字符串本身并未改变。因此需要将返回值赋予自身变量,例如str = str.replace(oldChar,newChar)。
②字符串反转函数reverse(),String类型字符串无法使用,因此需要定义StringBuilder类型字符串。
③StringBuilder型字符串无法直接使用equals()比较两个字符串是否相等,因为StringBuilder类的equals()没有重写,内部依然使用了==的比较方法,所以即使两个相等的字符串比较也为false。因此需要将两个StringBuilder类型字符串用toString()转换为String类型后再用equals()进行比较。