2018年Java方向C组第八题

2021-03-30  本文已影响0人  D丝学编程

标题:等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

  1. 先用1,2,3,...的自然数拼一个足够长的串
  2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
    比如,当三角形高度是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");
上一篇下一篇

猜你喜欢

热点阅读