【问题标题】:Printing the patterns using only one loop仅使用一个循环打印图案
【发布时间】:2012-12-18 16:12:46
【问题描述】:

我用一个循环打印了这个图案:

*
**
***
****
*****

String s = "";
for (i = 1; i <= n; ++i) {
    s += "*";
    System.out.println(s);
}

现在我想如何只使用一个循环来打印以下模式。

1)
    *
   * *
  * * *
 * * * *
* * * * *

2)
  * * * * * 
   * * * *
    * * *
     * *
      *

3)
   1 2 3 4 5
   1 2 3 4
   1 2 3 
   1 2
   1

以及仅使用一个循环的其他类似模式,我已经使用多个循环完成了所有这些。

【问题讨论】:

  • 那么您认为您需要做什么?如何将两个循环合二为一?例如循环 0..N-1 { 循环 0..M-1 } 和循环 0..N*M-1 有什么区别。他们都绕着相同的次数。 ;)
  • 为什么是单循环这个具体要求?
  • @RohitJain 我很确定这些问题只是作为一个学术练习。 ;)
  • 我想要优化。两个循环的时间复杂度为 O(n^2),而只有一个循环的时间复杂度为 O(n)。并且 O(n)
  • 是的,在现代商业信息系统中,打印三角形图案可能会占用大量资源。您需要降低它的复杂性是可以理解的。这将使您在竞争对手之前获得很多优势。

标签: java loops for-loop design-patterns


【解决方案1】:

我想要优化。两个循环的时间复杂度为 O(n^2),而只有一个循环的时间复杂度为 O(n)。并且 O(n)

您意识到 99.999% 的时间将用于更新控制台。如果您想节省时间,请不要写任何东西。相比之下,循环所花费的时间微不足道。

顺便说一句,您产生的星数将为 O(N^2),因此无论您使用 1、2 或 3 个循环,时间复杂度都是 O(N^2)。

【讨论】:

  • 你能简单解释一下吗?我没听懂。怎么可能是O(N^2),因为只有一个for循环?
  • 你需要产生N^2颗星,所以一个循环要迭代N^2次。如果你使用三个循环,它仍然是 O(N^2) O 不仅仅是计算循环数的问题。 ;)
【解决方案2】:

以下代码将使用单循环打印菱形。您可以相应地更改 size 变量的值。

import java.util.Arrays;

class DiamondShapeUsingSingleLoop{
    public static void main(String args[]){
        int size = 5;
        for(int rowNumber = -size +1 ; rowNumber < size ; rowNumber++){
            char row[] = new char[2*size - Math.abs(rowNumber) - 1];
            Arrays.fill(row,0,Math.abs(rowNumber),' ');
            Arrays.fill(row,Math.abs(rowNumber), row.length,'*');
            System.out.println(String.valueOf(row));
        }
    }
}

输出如下:

    *                                                                                                                                                           
   ***                                                                                                                                                          
  *****                                                                                                                                                         
 *******                                                                                                                                                        
*********                                                                                                                                                       
 *******                                                                                                                                                        
  *****                                                                                                                                                         
   ***                                                                                                                                                          
    *

【讨论】:

  • //使用相同逻辑的菱形只能使用递归打印。导入 java.util.Arrays;公共类 DiamondShapeWithoutUsingLoop { public static void main(String args[]){ int size = 5; printRow(-size+1, 大小); } static void printRow(int rowNumber, int size){ if(rowNumber==size) return; char row[] = new char[2*size - Math.abs(rowNumber) -1]; Arrays.fill(row,0,Math.abs(rowNumber),' '); Arrays.fill(row,Math.abs(rowNumber), row.length,'*'); System.out.println(String.valueOf(row)); printRow(rowNumber+1,size); } }
【解决方案3】:
    *
   * *
  * * *
 * * * *
* * * * *

写一些需求——然后解决方案就变得清晰了:

  • 在迭代 0 时,在位置 4 处打印 1 "* " 序列
  • 在迭代 1 时,在位置 3 处打印 2 "* " 序列
  • 在迭代 2 时,在 2 位置打印 3 "* " 序列
  • 在迭代 3 时,在 1 位置打印 4 "* " 序列
  • 在迭代 4 时,在 0 位置打印 5 "* " 序列

【讨论】:

  • 但是没有。行数将从用户那里获取?它应该是通用的。
  • 您展示了三个模式,每个模式有五行。不需要n 行。 (顺便说一句,这很简单:从int numLines=5; 开始并实现循环,然后将值更改为其他值并从控制台读取,一旦算法为所有输入(包括负值、0 和令人难以置信的大数字)提供预期结果))
  • 到达位置 4、3、2 等需要一个单独的循环,不是吗?或者有没有办法将空格相乘?
【解决方案4】:

int col=1; int 空间=4;

   for(int i=1;i<=5;i++){
       for(int j=1;j<=space;j++){
           System.out.print(" ");

    }
       space--;

    for(int j=1;j<=col;j++){
    System.out.print("*");
        }
    System.out.println();
    col=col+2;

【讨论】:

  • 为什么这能解决问题?不要在这里转储你的代码,解释一下!
【解决方案5】:

您可以打印菱形,只需使用一个循环 如果你想打印金字塔使用这个程序的一半逻辑

import java.util.Scanner;
class DiamandOneLoop {

    public static void main(String arg[]){
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter the row Diamond Size");
        int n=sc.nextInt();
        String numSp="                                                                   ";
        String spaceAdd=numSp.substring(0,n-1);
        StringBuilder space=new StringBuilder(spaceAdd);
        StringBuilder star=new StringBuilder("* ");

        for(int i=1;i<=n*2-1;i++){
            if(i<n){
                System.out.print(space);
                space.delete(0,1);
                System.out.println(star);
                star.append("* ");
            }
            if(i==n){
                System.out.println(star);
            }
            if(i>n){
                space.append(' ');
                System.out.print(space);
                star.delete(0,2); 
                System.out.println(star);
            }
        }
    }
} 

【讨论】:

    【解决方案6】:

    使用单循环打印图案:

    代码是用objective-c编写的,任何人都可以使用这个逻辑并用他们各自的语言编写程序。

    int k = 5;

    for (int i = 1; i<= k; i++)
    {
        NSLog(@"%d",i);
        if (i==k) {
            i=0;
            k--;
            NSLog(@"\n");
        }
    }
    

    输出:

    1 2 3 4 5

    1 2 3 4

    1 2 3

    1 2

    1

    【讨论】:

      【解决方案7】:

      试试这个 JavaScript 代码:

      count=0, j=0, str="";
      while(count < 5) {
          if(j < 4 - count) {
              str += " ";
              j++;
          } else if(j < 5) {
              str += "* ";
              j++;
          } else {
              str += "\n";
              count++;
              j = 0;
          }
      }
      console.log(str);
      

      【讨论】:

        【解决方案8】:

        这是c中的解决方案

        #include<iostream>
        using namespace std;
        int main(){
            int n=15;
            int x=1;
            int j=1;
            for(int i=1;x<=n; )
            {
        
                if(!(j<=i))
                {
                    cout<<endl;
                    j=1;
                    i++;
                }
                else
                {
                    cout<<"*";
                    x++;
                    j++;
                }
        
            }
        }

        欢迎提问

        【讨论】:

          【解决方案9】:

          从 JDK 11 开始,我们可以使用单循环打印任何基本模式,即使使用单语句也是如此。在 JDK 11 中,我们有一个名为 repeatString 方法。

          class Sample
          {
           public static void main(String...arg)
           {
            int n = 5;
            
            System.out.println("\nPattern #1");
            for(int i=0;i<=n;i++)
             System.out.println(" ".repeat(n-i)+"* ".repeat(i));
           }
          }
          

          【讨论】:

            【解决方案10】:

            我想要优化。两个循环的时间复杂度为 O(n^2),而只有一个循环的时间复杂度为 O(n)。并且 O(n)

            最佳解决方案是没有循环吗?

            System.out.println("     *\n    * *\n   * * *\n  * * * *\n* * * * *");
            

            如果你真的想用一个循环来做到这一点,你可以使用逗号运算符和 String format()replace() 方法的强大功能:

            int j = triangle_levels - 1; // triangle_levels is some int you can make 5, but this 
                                         // is more generic
            for(int i = 0; i < triangle_levels; j--, i++) {
                System.out.println("%" + j + "s", " ");
                System.out.println("%0" + (i+1) + "d", 0).replace("0", "* "));
            }
            

            这将允许您在没有第二次循环的情况下打印空格数,后跟*'s 的模式。

            您可以使用这种类型的解决方案来制作任意方向的三角形。

            【讨论】:

              【解决方案11】:

              用单环制作星形金字塔

              for(i=0; i<a; i++)
              {
                  for(j=0; j<a-i-1; j++)
                      printf(" ");
                  for(j=0; j<2*i+1; j++)
                      printf("*");
                  printf("\n");
              }
              

              【讨论】:

              • 这是三个循环。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-15
              • 1970-01-01
              • 2017-07-28
              • 1970-01-01
              相关资源
              最近更新 更多