给定整数 N,任务是打印一个倒三角形,其中左半部分由 [1, N*(N+1)/2] 范围内的元素组成,右半部分由 [N*(N+1)/2 + 1, N*(N+1)] 范围内的元素组成。
例子:
输入: N = 3
输出:
1*2*3*10*11*12
4*5*8*9
6*7
输入:n = 4
输出:
1*2*3*4*17*18*19*20
5*6*7*14*15*16
8*9*12*13
10*11
方法:
观察该图案,我们可以很容易地发现它遵循了 ZIG-ZAG 图案,首先从顶行到底行打印几个数字,然后从底行到顶行打印数字,数字越来越多
连字符模式:第i行的空格数为i*2 [此处 i 从 0 开始]
由于数字在此锯齿形格式中按递增顺序排列,因此我们可以将这些数字存储在二维动态数组中,并根据每行空格数的情况相应地打印它们。
按照下面提到的步骤来实现这个想法:
1、创建一个大小为N*N的二维向量arr[],使得矩阵为N*N。
2、然后从上到下遍历数组并将第i行的数字(Ni)压入。
3、同样的,从下往上遍历,以同样的方式从下往上推送元素。
4、启动循环并遍历列并打印数组:
4.1、然后,遍历i*2的长度,按递增的顺序打印每行前的空格。
4.2、在行中的每个元素后打印*
下面是上述方法的实现:
// Java code to print the above pattern
import java.util.*;
class GFG {
// Function to print the pattern
public static void printPattern(int n)
{
List<List<Integer> > list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(new ArrayList<>());
}
int num = 1;
// First Traversal top to bottom
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++) {
list.get(i).add(num++);
}
}
// Second Traversal bottom to top
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j < n - i; j++) {
list.get(i).add(num++);
}
}
for (int i = 0; i < n; i++) {
for (int ch = 0; ch < (i * 2); ch++) {
// '-'s is printed before each row
// in a increasing order
System.out.print(' ');
}
for (int j = 0; j < list.get(i).size(); j++) {
System.out.print(list.get(i).get(j));
if (j != list.get(i).size() - 1) {
// * is not printed after
// the last element in a
// row
System.out.print('*');
}
}
System.out.println();
}
}
// Driver code
public static void main(String[] args)
{
int N = 3;
// Function call
printPattern(N);
}
}
输出
1*2*3*10*11*12
4*5*8*9
6*7
时间复杂度: O(N 2 )
辅助空间: O(N 2 )