2018年Java方向C组第八题
标题:等腰三角形
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
- 先用1,2,3,...的自然数拼一个足够长的串
-
用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
2.png
输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。
为了便于测评,我们要求空格一律用"."代替。
例如:
输入:
5
程序应该输出:
....1
...2.1
..3...2
.4.....1
567891011
再例如:
输入:
10
程序应该输出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
再例如:
输入:
15
程序应该输出:
..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
解析:
Scanner input = new Scanner(System.in);
int high = input.nextInt(); //输入三角形高度
//long start=System.currentTimeMillis();
char[][] arr = new char[high][2*high-1];
//为二维数组每个元素赋值.
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = '.';
}
}
//根据高度求总字符个数,2*h-3=两斜边的字符个数总和,2*h-1为底边的字符个数
int charCount = 2*high-3 + 2*high-1; //求总共字符个数
String str = "";
//用循环将所有数字组合转换成字符串,最多循环次数应该是字符总个数
for (int i = 1; i <= charCount; i++)
{
str += i+"";
if(str.length() >= charCount) //字符串长度大于等于总字符个数的时候退出
{
str = str.substring(0, charCount);
break;
}
}
int index = 0; //保存数字字符串当前的下标
//给左斜边填充
int x = 0;
int y = high-1;
for (int i = 1; i <= high-1; i++) {
arr[x][y] = str.charAt(index++);
x++;
y--;
}
//给底部填充
x = high-1;
y = 0;
for (int i = 1; i <= 2*high-1; i++) {
arr[x][y] = str.charAt(index++);
y++;
}
//给右斜边填充,从右下向左上填充,最后一个字符不需要填充
x=high-2;
y=2*high-3;
for (int i = 1; i <= high-2; i++) {
arr[x][y] = str.charAt(index++);
x--;
y--;
}
//嵌套循环打印结果
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(j <= i+high-1) //程序右边的点不用打印
System.out.print(arr[i][j]);
}
System.out.println();
}
//long end=System.currentTimeMillis(); //获取结束时间
//System.out.println("程序运行时间: "+(end-start)+"ms");