4

我使用一个循环打印了这种模式:

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

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

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

4

11 回答 11

6

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

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

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

于 2012-12-18T16:30:00.190 回答
3

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

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));
        }
    }
}

输出如下:

    *                                                                                                                                                           
   ***                                                                                                                                                          
  *****                                                                                                                                                         
 *******                                                                                                                                                        
*********                                                                                                                                                       
 *******                                                                                                                                                        
  *****                                                                                                                                                         
   ***                                                                                                                                                          
    *
于 2017-04-27T10:26:51.940 回答
1
    *
   * *
  * * *
 * * * *
* * * * *

写一些要求 - 然后解决方案变得清晰:

  • 在迭代0时,在位置4打印1 个序列 "* "
  • 在迭代1中,在位置3打印2 个序列 "* "
  • 在迭代2中,在位置2打印3 个序列 "* "
  • 在第 3次迭代中,在位置1打印4 个序列 "* "
  • 在第 4次迭代中,在位置0处打印5 个序列 "* "
于 2012-12-18T16:35:55.793 回答
0

int col=1; 整数空间=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;
于 2013-10-02T19:53:14.637 回答
0

您可以打印菱形,仅使用一个循环,如果您想打印金字塔,请使用该程序的一半逻辑

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);
            }
        }
    }
} 
于 2016-11-17T10:46:04.973 回答
0

使用单循环打印图案:

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

诠释 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

于 2017-06-09T04:30:51.373 回答
0

试试这个 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);
于 2018-02-25T18:19:24.277 回答
0

这是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++;
        }

    }
}

请随时询问

于 2018-04-11T20:03:37.577 回答
0

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

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));
 }
}
于 2021-08-09T11:05:22.803 回答
-1

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

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

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

如果你真的想用一个循环来做到这一点,你可以使用逗号运算符以及 Stringformat()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 模式。

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

于 2012-12-18T16:40:36.233 回答
-1

用单环制作星形金字塔

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");
}
于 2017-06-05T06:13:18.230 回答