打印菱形-最高效的算法之一

40 篇文章 3 订阅

1 题目:请写一个程序,它能够打印符合以下规则的任意行数的图形,其中输入为int型参数,代表图形行数,且该行数为大于3的奇数。
在这里插入图片描述
2 解题思路:
思路1:将图形分成2个部分,上部分一个循环,下部分一个循环,分别打印” ”和*;但这种方法效率太低。
思路2:将图形分成2个部分,上部分作为一个循环,分别打印” ”和*;并把前(行数-1/2)的打印内容存入栈中,之后再打印栈中的内容,这样效率会很高。当输入数值为101时,打印时间仅为5ms,而采用思路1时,需要2851ms。
3 java代码

import java.util.*;
/*
   用栈实现
 */
public class PrintChartOne {
    public static void main(String[] args){
        System.out.println("请输入字符串=? ");
        Scanner input=new Scanner(System.in);
        int lineNumber=input.nextInt();
        long startTime = System.currentTimeMillis();//获取当前时间
        PrintChartOne printChartOne=new PrintChartOne();
        printChartOne.printPentagram(lineNumber);
        long endTime = System.currentTimeMillis();
        System.out.println("程序运行时间:"+(endTime-startTime)+"ms");
    }
    public  void printPentagram(int lineNumber){
        if ((lineNumber>3) &&(lineNumber%2==1) ) {
            String sStar = "*";
            String sBlank = " ";//空格
            //字符串栈
            Stack sPrintStackS = new Stack();
            for (int i = 1; i <= (lineNumber - 1) / 2 + 1; i++) {
                String sPrintStar = "";//用来打印每行的"*"
                String sPrintBlank = "";//用来打印每行的" "
                //前i 每行*的数量
                int sStarNumber = 2 * i - 1;
                for (int j = 1; j <= sStarNumber; j++) {
                    sPrintStar = sPrintStar + sStar;
                }
                //前i 每行" "的数量
                int sLeftBlankNumber = (lineNumber - sStarNumber) / 2;
                for (int k = 1; k <= sLeftBlankNumber; k++) {
                    sPrintBlank = sPrintBlank + sBlank;
                }
                //打印前(lineNumber-1)/2+1行
                String sPrint = sPrintBlank + sPrintStar;
                System.out.println(sPrint);
                //前i-1行内容写入栈
                if (i <= (lineNumber - 1) / 2) {
                    sPrintStackS.push(sPrint);
                }
            }
            //打印后(lineNumber-1)/2行
            while (!sPrintStackS.empty()) {
                System.out.println(sPrintStackS.pop());
            }
        } else System.out.println("请输入大于3的奇数!");
    }
}



4运行结果
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值