Java实现打印指定行数的空心菱形的功能

最近遇到一题需要实现打印指定行数的空心菱形的功能。

语言类型: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();
        }
    }
}

 运行结果:

 

 如果有其他更优质的算法也可在评论区一起讨论,或者私信我也可呀!

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值