最近遇到一题需要实现打印指定行数的空心菱形的功能。
语言类型:Java语言
操作环境:Window 10
使用工具:IntelliJ IDEA 2020.1.4
一开始我觉得挺简单的,后来到我去做的时候发现,里面涉及一些算法问题。
琢磨了大半天我终于给弄出来了。所以呢,感紧做个笔记,哈哈。
看图
图1 图 2
大概分析一下:
上半部分:
上半部分呢,首先是第一个for循环,它是输出行数的外循环,这里有个特别的地方就是,题目说是打印指定行数的菱形,这可就难搞了,一开我也没考虑到这个问题,因为我是用奇数行测试的,菱形是很如上如(图1)所示,后来用偶数行发现是多了一行,最后我是在行数后面加一个flag值,这个值由输入行数进行取模计算,即flag=num%2,这样就解决了行数不相等的问题了,输入偶数行,如(图2)所示,就是8行。
说完行数,再说一下列数,也就是内循环。内循环呢就是空格和“ * ”的问题了,上部分从行数往下看,就是“ * ”由中间往两边扩展,我把每一行分为三部分去分析,从左往右就是第一部分先要输出空格,然后第二部分也就是“ * ”,最后是“ * ”之间的空格问题。
第一部分:写一个for循环,输出每一行空格的列数,列数由输入的行数除以2再减去行数控制。
第二部分:就是打印“ * ”了,前一个for循环已经把外部空格填充满了,这里就再写一个for循环,列数还是由外部循环,也就是行数决定,根据菱形上部分观察可知,从顶点往下数是1,3,5......奇数列,用其实就是等差数列,j < 2 * (i + 1) - 1 ,只要小于这个范围就可以了;那么要实现空心菱形呢,取头尾两个值就可以了,也就是需要设一个if语句,如果本循环的 j 等于第一个或最后一个,就能打印出“ * ”了。
第三部分:就是第二部分中除了头尾部分的列数了,其实第三部分就包含在第二部分内,是在if语句后的else语句,也就是否则取空格。
下半部分:
在这个空心菱形里呢,难住我的是空心菱形的下半部分,一开始我是按上部分的思路去解决的,后来发现怎么测试都不得。最后只需把上部分中的第一部分的循环初始值改为输入行数的一半,然后范围取大于或等于1即可。第二部分和第三部分不用修改,总的来说就是下半部分是倒过来的。
为了更直观的便于理解,我把外部空格用“ - ”代替,内部空格用“ # ”代替,这里做一下截图展示:
嗯,就是这样子了。
因为最终还是以题目空心菱形为主,我就把“ - ”和“ # ”去掉。
分析了一大串,还是上代码比较靠谱吧。
源代码:
import java.util.Scanner;
/**
* 实现打印指定行数的空心菱形的功能
*/
public class Demo9 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入空心菱形的行数:");
int num = input.nextInt();
int flag = num % 2; //根据输入的行数是奇数还是偶数
//-----------上半部分---
for (int i = 0; i < num / 2 + flag; i++) { //上半部分的行数,如果行数为奇数,flag=1,输出(行数/2+1)行,偶数,flag=0,就直接输出一半行数
for (int k = 0; k < num / 2 - i ; k++) {//打印外部分空格的列数
System.out.print(" ");
}
for (int j = 0; j < 2 * (i + 1) - 1; j++) {//打印“*”的列数
if (j == 0 || j == 2 * (i + 1) - 2) { //如果列数为首尾,则打印“*”,否则打印空格
System.out.print("*");
} else {
System.out.print(" ");//内部空格
}
}
System.out.println();
}
//-----------下半部分
for (int i = num / 2; i >= 1; i--) { //行数
for (int k = 0; k < num / 2 - i +1; k++) {//打印空格的列数
System.out.print(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {//打印*的列数
if (j == 0 || j == 2 * i - 2) {//如果列数为首尾,则打印“*”,否则打印空格
System.out.print("*");
} else {
System.out.print(" ");//打印内部空格
}
}
System.out.println();
}
}
}
运行结果:
如果有其他更优质的算法也可在评论区一起讨论,或者私信我也可呀!