題目要求:根據寬 w、高 h 打印矩形,最外層 *,內部 #、@ 交替填充,形成同心矩形層效果。
printRect(21, 9);
*********************
*###################*
*#@@@@@@@@@@@@@@@@@#*
*#@###############@#*
*#@#@@@@@@@@@@@@@#@#*
*#@###############@#*
*#@@@@@@@@@@@@@@@@@#*
*###################*
*********************
對任意位置 (i, j)(1-based),計算其到四邊的最小距離 p = min(j, w+1-j, i, h+1-i),即所在「層數」:
p == 1:最外層 → *p % 2 == 0:偶數層 → #p % 2 == 1:奇數層(>1)→ @def printRect(w, h):
for i in range(1, h+1):
for j in range(1, w+1):
p = min(min(j, w+1-j), min(i, h+1-i))
if p == 1:
print('*', end='')
elif p % 2 == 0:
print('#', end='')
else:
print('@', end='')
print()
public void printRect(int w, int h) {
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
int p = Math.min(Math.min(j, w + 1 - j), Math.min(i, h + 1 - i));
if (p == 1) {
System.out.print('*');
} else if (p % 2 == 0) {
System.out.print('#');
} else {
System.out.print('@');
}
}
System.out.println();
}
}
時間 O(w×h),空間 O(1)。單次遍歷無額外存儲,極致高效。