

解析:
规律:每增加一行,该行字母就会向右移动一位,同时左边补充一个字母。
关键点规律:每行的输出都是以A为起点,分别向A的左右两边按字母表的顺序依次输出。每行的起始字母在字母表中的顺序与当前行数相等,比如第一行A开头,第二行B开头。
存在三种特殊情况:A处于最左边,A处于最右边,A不在显示范围。不管是哪种情况,这种规律都适用。A处于最左边时只向A的右边输出,A处于最右边时只向A的最左边输出,A不在显示范围时还是只向A的最左边输出。
易错点: 这里有个地方容易忽视,因为题目只给了一个例子,这个例子是m>n的,这种情况是很容易实现的,所以就会忽视m<n的这种情况,比如当n=5,m=2时。
上代码:
package _3_5_test;
import java.util.Scanner;
public class FourtyThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
String letter[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z" };
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int flagNum = 0;
// 输出图形
// 行
for (int i = 0; i < n; i++) {
boolean flag = false;
flagNum = i;
// 列
for (int j = 0; j < m; j++) {
// 每行第一个输出的字母在字母表中的顺序正好与当前行数相等
System.out.print(letter[flagNum]);
// 如果当前字母是A开头或者A居中间并且已经输出,则将判断条件改成true
if (flagNum == 0) {
flag = true;
}
// 如果是true,flagNum递增,字母向A的右边输出;如果是false,flagNum递减,字母向A的左边输出;
if (flag) {
flagNum++;
} else {
flagNum--;
}
}
System.out.println();
}
}
}

