题目:
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
输入,一个正整数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
分析:
1
首先我们先把所有需要打印的数字按照顺序储存起来,等腰三角形的底边等于2乘腰-1,根据这个我们就可以用4n-4来表示所有需要打印的数字。
2
从1开始到99999一直往string字符串中加入数字,只要字符串长度大于4n-4就立即停止。
3
两层循环,第一层控制行数,第二层控制每行的总数量,通过观察我们发现左边的腰每次都向左移动,那么直接从一开始的值每次都减去控制行数的i,只要j等于h(1一开始对应的位置)-i-1那么直接顺序输出字符串中的数字,右边腰同理。其他情况全都打印.
4
最下面一行打印的是从第i项目到count-i+1
步骤:
![](https://i-blog.csdnimg.cn/blog_migrate/1914cbe45cd52da75849e8510196e7ba.png)
package 历届真题省赛阶段;
import java.util.Scanner;
public class 测试1 {
public static void main(String[] args) {
int h = 15;// 高度
int count = 4 * h - 4;// 需要的数字总数量
String str = "";// 用于储存数字
int k = 0;// 索引表,用来记录数字的使用
for (int i = 1; i < 999999; i++) {
if (str.length() > count) {//只要字符串长度大于需要的总数量那么就结束,要不就继续进行从1进行累加
break;
} else {
str += i;
}
}
for (int i = 0; i < h; i++) {//外层控制行数
for (int j = 0; j < h + i; j++) {//内层控制每行的数量
if (i == h - 1) {//当最后一行的时候直接进行字符串截取
System.out.print(str.substring(k, count - i + 1));
break;
} else if (j == h - i - 1) {//左边的腰每次都向左移动,那么直接从一开始的值每次都减去控制行数的i
System.out.print(str.charAt(k++));//通过每次自增的索引来打印str正常顺序
} else if (j == h + i - 1) {//右边的腰每次都向右移动,那么直接从一开始的值每次都减去控制行数的i
System.out.print(str.charAt(count - i));
} else {
System.out.print(".");
}
}
System.out.println();
}
}
}