java 金字塔 空心金字塔 空心菱形 详解(通俗易懂)

简介: 分享以下用java如何打印出金字塔,空心金字塔和空心菱形,适合初学者思维锻炼,思路分析是重点。

目录

一、前言

二、金字塔:

       1.思路分析:

       2.代码演示:

三、空心金字塔:

       1.思路分析:

       2.代码演示:

四、空心菱形:

       1.思路分析:

       2.代码演示:

五、完结撒❀:


一、前言

               大家好,今天和大家分享以下用java如何打印出金字塔,空心金字塔以及空心菱形,我会一一进行代码演示,并尽量做一些注释,帮助大家理解。

二、金字塔:

       1.思路分析:

       首先我们希望代码的运行效果可以如下gif图所示:

image.png

       分析I:仔细观察打印出的金字塔,我们发现从第一层开始,每一层的 * 的数量越来越多,而且呈现出1,3,5,7,9,11......2n-1 的规律,那么我们就权且以2n-1为每层 * 的数量。

      分析II:除了最后一行外,每层的 * 前面都会有空格,所以我们要想打印出金字塔,就必须在每层先打印空格,再打印 * ,打印完一层的再打印下一层。那么,如何得知每层 * 前面需要打印空格的数量呢?下面我们以一个5层的金字塔为栗,一起找找规律。

       如图:

     image.png

       假设我们就有这么一个5层的金字塔,从左边白线开始到中间的灰线,是1-5个位置 , 即金字塔中间灰线上的 * 是第五个位置,那么大家可以发现,在每层的前五个位置中,第五个的位置都是 * ,而每层前面的空格数则是4,3,2,1依次递减,到了第五层就没有空格了。即每层前五个位置状况如下:

       第层 ----- 4个空格+1个 *  

       第层 ----- 3个空格+2个 *

       第层 ----- 2个空格+3个 *

       第层 ----- 1个空格+4个 *

       第层 ----- 0个空格+5个 *

       结论每层前面的空格数 = 总的楼层数 - 当前楼层编号

       2.代码演示:

       👌,经过分析I和分析II,我们以及可以敲代码了,我们以Pyramid类作为演示类,

       Pyramid类代码如下:

packagecsdn2022.pyramid;
importjava.util.Scanner;
publicclassPyramid {
publicstaticvoidmain(String[] args) {
//we try printing a solid pyramid.Scannersc=newScanner(System.in);
System.out.println("------------------------------------------");
System.out.println("请输入你想得到的金字塔的层数:");
intfloors=sc.nextInt();
for (inti=1; i<=floors; ++i) {
/*print " " before print "*"The number of " " is (floors - i),actually it's Total floor number minus current floor number.打印出每层中 * 前面的空格,实际上空格的数量 = 总的楼层数 - 当前层编号。*/for (intk=1; k<= (floors-i); ++k) {
System.out.print(" ");
            } //第一个for打印出每层前面的空格for (intj=1; j<= (2*i-1); ++j) {
System.out.print("*");
            } //第二个for打印出每层的 * System.out.println();
//两个for完了,换行打印下一层        }
System.out.println("------------------------------------------");
sc.close();
    }
}

image.gif

              运行效果:(如下gif图)

image.png

三、空心金字塔:

       1.思路分析:

               首先我们肯定希望代码的运行效果如下gif图所示:

image.png

               分析I:金字塔每层 * 的数量,(此处为空心金字塔,可对应理解为金字塔每层需要输出的元素的多少), 以及每层第一个 * 之前需要打印出空格的数量,我们都在金字塔的思路分析中详细讲过,有同学如果是跳转过来看的,可以回去看看金字塔部分的思路分析。

               分析II : 不难发现,空心金字塔和金字塔仅有一个区别,就是金字塔每层都是 * ,而空心金字塔每层除了首尾元素是 * 之外,其他都是空的,当然,除了最后一层。大家可以这么理解,将一个中间为空的大金字塔拆解为一层一层的,只要能够实现每层除了首尾为 * ,其他都是空的,那么把所有层叠加起来,也就实现了整体上为空的效果了

              Question:那么,如何用代码实现这个变动呢?

就像我们在金字塔中演示的代码一样,我们首先肯定需要两个变量 ij 来分别保存 当前楼层编号每层的元素,外层for循环为 i ,代表一层一层的打印,内层仍是两个for循环,第一个for循环打印出每层前面的空格,第二个for循环用于输出元素。但是第二个for循环要出现变化,我们需要在第二个for循环内增加一个if的条件语句进行判断,如果当前打印的是每层的首尾元素,或者正在打印最后一行的元素,那我们就输出 * ,反之,我们就输出空格,如此便可实现需求。

       2.代码演示:

packagecsdn2022.pyramid;
importjava.util.Scanner;
publicclassHollowPyramid {
publicstaticvoidmain(String[] args) {
//requirement : 打印出空心金字塔intfloors;
Scannersc=newScanner(System.in);
System.out.println("请输入空心金字塔总的楼层数");
floors=sc.nextInt();  //Enter the total number of floorsfor (inti=1; i<=floors; ++i) {
for1 :
for (intt=1; t<= (floors-i); ++t) { //the number of " " boil down to (floors - i3)System.out.print(" ");
            }
/*上面这个for1循环是为了打印出每层前面的空格数而我们之前在讲金字塔的思路分析时,就已经说过每层前面的空格数是怎么来的。*/for (intj=1; j<= (2*i-1); ++j) {  //remember here is "<="if (j==1||j== (2*i-1) ||i==floors) {      //Determine if it's the first position and the last positionSystem.out.print("*");
                } else {
System.out.print(" ");  //if it isn't, print the blank.                }
            }
System.out.println();
        }
System.out.println("------------------------------------------");
sc.close();
    }
}

image.gif

              运行效果:(如下gif图

image.png

四、空心菱形:

       1.思路分析:

               空心菱形,说白了就是给空心金字塔穿条裤子罢了,直接上运行效果GIF图看看:image.png

              Δ总思路由于上半部分和下半部分是反的,所以我们先打印上半部分,再打印下半部分,而上半部分无非就是把空心金字塔的最后一层稍作变动,因此重点就是打印菱形的下半部分

               分析I :刚刚展示了空心金字塔的思路分析,想必你也有了一定自己的思路,起码有一点是肯定的,这里空心金字塔的“空心”的效果,其代码实现一定是与空心金字塔同理的。因此这里就不再赘述,跳转过来的小伙伴儿可以去看看空心金字塔的思路分析II。

              分析II:需要注意的是,空心菱形中间最长的那一行不在和空心金字塔一样全是 * 了,而是也为空,这时我们只需要将if条件语句中的“是否为最后一行”这一判断给删去,只剩下“是否为首尾位置”的判断即可

               分析III(重要):由于我们打印是一层一层来打印的,而下半部分和上半部分截然相反,因此我们的代码实现也需要做出调整。下面我以一个5层的空心菱形为栗,给大家讲讲下半部分我们究竟该如何打印,如下图

image.png

               首先,由于下半部分与上半部分共用一行,因此,上半部分打印出中间行后,下半部分就会比上半部分少打印一层,体现在代码上就是外层for循环的条件语句从 i <= floors; 变成了 i < floors;,然后,就是下半部分打印的两个重点:①每层前的空格数,②每层对首尾元素的判断

               ①先来说说每层前的空格数,注意看上图,下半部分,第一行前有1个空格,第二行前有两个空格,第三行前有三个空格.......,所以每层前面的空格数就等于当前楼层编号!                                      ②再来说说每层对首尾元素的判断,注意看上图,每层除去前面的空格数,打印出的元素个数相当于把正的空心金字塔倒着打印了,此处为7,5,3,1。

               大家想想在正的空心金字塔中是怎样的一个对应关系:1,2,3,4......i 层,分别对应了1,3,5,7......(2*i - 1)个元素,而再看现在倒着的空心金字塔却是  1,2,3,4层对应了7,5,3,1个元素

               大家有没有想过,但凡将楼层编号或者每层元素个数中一个颠倒一下,那不就对上了!所以,大家这么来看:(注意,还是5层为栗,即floors = 5

               第1层 ---> 7个元素 ---> 2*(floors-1) - 1 个元素

               第2层 ---> 5个元素 ---> 2*(floors-2) - 1 个元素

               第3层 ---> 3个元素 ---> 2*(floors-3) - 1 个元素

               第4层 ---> 1个元素 ---> 2*(floors-4) - 1 个元素

               ....................................................

               第i层 ---> 2 * (5 - i) - 1个元素 ---> 2*(floors-i) - 1 个元素

               👌,聪明的你一定已经发现了,将楼层编号与楼层数挂上钩之后,一切都回来了!没错,每层的元素个数就是 2*(floors - i) - 1

               对了,如果实在不理解的,强烈建议大家用试数法,自己带几个数进去,拿笔画画,多试几次自然明了。                                                                                            

       2.代码演示:

packagecsdn2022.pyramid;
importjava.util.Scanner;
publicclassHollowLozenge {
publicstaticvoidmain(String[] args) {
//requirement: print a hollow lozenge[ˈlɑːzɪndʒ] 打印一个空心菱形Scannersc=newScanner(System.in);
System.out.println("请输入你想获得的菱形的规模:(以半个菱形的高度为基准)");
intfloors;
floors=sc.nextInt();
//top half 上半部分代码原理与空心金字塔一致for (inti=1; i<=floors; ++i) {
for (intt=1; t<= (floors-i); ++t) {
System.out.print(" ");
            }
for (intj=1; j<= (2*i-1); ++j) {  //remember here is "<="if (j==1||j== (2*i-1)) {     //Determine if it's the first position and the last positionSystem.out.print("*");          //if it is, print the real element.                } else {
System.out.print(" ");          //if it isn't, print the blank.                }
            }
System.out.println();
        }
//(The method of Try numbers is YYDS) 下半部分代码一时不易理解,但大家记住:试数法永远滴神//bottom half 下半部分for (inti=1; i<floors; ++i) {//注意打印下半部分时,外层for循环这里变成 < 了,而不再是 <=for (intt=1; t<=i; ++t) {
System.out.print(" ");
            }
/*lozenge:top half and bottom half share the middle line,so bottom half lacks one line.in bottom half,the number of " " is just i(equals floors numerically)*/for (intj=1; j<=2*(floors-i) -1; ++j) {
if (j==1||j== (2*(floors-i) -1)) {
System.out.print("*");
                } else {
System.out.print(" ");  //if it isn't, print the blank.                }
            }
System.out.println();
/*How to understand the bottom half' code?//(level - i) is truly likely the reverse arrangement: (下半部分像一个倒置排列的上半部分-1行)like floors = 5,floors - 1 = 4;floors - 2 = 3;floors - 3 = 2;floors - 4 = 1;so (floors - i)= like positive-going arrangement.//remember it is "<=".//Determine if it's the first position and the last position.*/        }
sc.close();
    }
}

image.gif

               运行效果:(如下GIF图)

image.png

五、完结撒❀:

               其实,java打印空心XXX没有太大的难度,也没有考算法,无非是对自我编程思维的锻炼,恭喜你看到这里,感谢阅读!

System.out.println("------------------------------------------------------------------------------------------");

目录
相关文章
|
3月前
|
Web App开发 算法 安全
《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
本文深入解析了WebRTC应对NAT穿透的技术体系。NAT因类型多样(完全锥形、受限锥形、端口受限锥形、对称NAT)给端到端通信带来挑战,而WebRTC通过STUN服务器探测公网地址与NAT类型,借助ICE协议规划多路径(本地地址、公网反射地址、中继地址)并验证连接,TURN服务器则作为中继保障通信。文章还探讨了多层NAT、运营商级NAT等复杂场景的应对策略,揭示WebRTC通过探测、协商与中继实现可靠通信的核心逻辑,展现其在网络边界中寻找连接路径的技术智慧。
184 7
|
SQL Java 数据库
2、Mybatis-Plus 测试增、删、改、查
这篇文章是关于使用Mybatis-Plus进行数据库的增删改查操作的本地测试,包括创建数据库表、添加数据、创建使用lombok的实体类、添加mapper接口以及编写测试代码进行基本的数据库操作验证。
2、Mybatis-Plus 测试增、删、改、查
|
7月前
|
人工智能 边缘计算 分布式计算
《分布式软总线:AI动态推理架构的智能“建造师”》
分布式软总线是一种具备自组织特性的关键技术,可灵活构建适应人工智能动态推理需求的分布式计算架构。它通过自主设备发现、灵活组网、动态资源调度及自我修复机制,实现高效协同计算。在智能交通、智慧医疗和工业智能制造等领域,分布式软总线优化了实时数据处理与任务分配,推动了AI技术与行业应用的深度融合,为社会发展带来变革性影响。其核心优势在于去中心化设计,能快速响应动态需求并保障系统稳定性,助力复杂推理任务高效完成。
232 2
|
11月前
|
前端开发 定位技术 数据库
如何自己独立制作网站?
本文介绍了网站建设的三大步骤:网站建设、域名注册、服务器租用。其中,定制建站是传统方式,SAAS平台和独立建站系统则更适合低要求和有建站需求的用户。
405 10
|
移动开发 前端开发 Android开发
【Uniapp 专栏】Uniapp 相较于其他跨平台框架的优势
【5月更文挑战第15天】Uniapp 是一款高效率的跨平台框架,一套代码可生成 iOS、Android、H5 等应用,减少重复工作。它具有强大兼容性,保证各平台稳定运行,提供一致体验。Uniapp 社区活跃,资源丰富,学习曲线平缓,适合新手。性能优化出色,可扩展性强,全面支持前端技术,降低开发和维护成本。因此,Uniapp 成为跨平台开发的热门选择。
442 0
【Uniapp 专栏】Uniapp 相较于其他跨平台框架的优势
|
达摩院 供应链 Cloud Native
低代码这么火,它的人才认证你考了吗?
2021年超级🔥 的证书!限时免费认证中……
8780 0
低代码这么火,它的人才认证你考了吗?
|
监控 安全 Apache
【Flume】Flume数据丢失问题及解决方案
【4月更文挑战第4天】【Flume】Flume数据丢失问题及解决方案
|
存储 关系型数据库 MySQL
校园闲置物品交易平台的设计与实现(论文+源码)_kaic
校园闲置物品交易平台的设计与实现(论文+源码)_kaic
|
存储 Web App开发 缓存
一个简单的弱网差点搞死了组内前端
最近上线了一个 React Native 外访项目,用户为公司外访员,外访员根据公司业务去实地考察,收集记录一些资料,考察记录资料的过程全部用公司配的专用手机,里面安装了当前外访项目APP。目前项目试运行阶段,还没有正式交付。APP项目上线后,在用户真实使用中遇到一些各种各样的问题,有些问题处理时也比较棘手(如弱网情况),这次主要复盘APP在实际场景中的弱网(或网络不稳定)相关的问题。
1110 0
一个简单的弱网差点搞死了组内前端
|
人工智能 算法 Java
我整理了50道经典Java算法题,直接进了字节跳动!!
最近,很多小伙伴都想进入字节跳动这个快速发展的公司,而字节跳动对于算法的要求比较高。于是乎,有些小伙伴问我能否整理一些基础的算法题,帮助他们提升下基础算法能力。我:没问题啊!于是,经过半个多月的收集和整理,最终输出了这50道经典的Java算法题。
5284 0