0

有一个数组,比如int[] arr = new int[]{9, 6, 5, 2, 1, 2, 6, 3, 2, 7, 3, 8, 1, 5, 4, 7};我想像这样打印它:

 * Output:
 * 9
 * 6 1
 * 5 2 2
 * 2 6 7 1
 * 3 3 5
 * 8 4
 * 7 

没有 * 基本上这就是我想要做的。我打算遍历数组并一直使用System.out.println();直到我到达“结束”,这将是 7,然后转到下一行,但这没有用。

我也尝试过打印 9 然后 6 和 1 等等,但我也无法让它工作,我在这里不知所措,希望能得到指导,请教我如何思考这个问题。

编辑

我的中间步骤是使数组成为这样的“块”:

 * Intermediate Step:
 * 9 6 5 2
 * 1 2 6 3
 * 2 7 3 8
 * 1 5 4 7

它应该适用于任何大小的数组。

4

3 回答 3

0

好的,首先:你不能为数组的每个长度打印一个这样的三角形。例如,假设您有该数组但缺少最后一个条目;那么你的三角形会在某个时候丢失一个元素。事实上,当且仅当元素的数量是自然数的平方时,您才可以打印这样的三角形;在您的示例中,16 = 4^2。现在,这 4 也是你最长行的长度。

好的,现在该怎么做。如果你看中间步骤

9 6 5 2
1 2 6 3
2 7 3 8
1 5 4 7

并调用它arr2,您想arr2[0][0]在第一行打印,arr2[1][0]然后arr2[0][1]在第二行打印,依此类推,直到第 4 行(这当然是初始数组长度的根)。所以你可以写一个这样计数的嵌套循环。

然后你想打印arr2[1][3],在下一行,然后arr2[2][2]是an ,最后在最后一行。这在第二个嵌套循环中最容易完成。arr2[3][1]arr2[2][3]arr2[3][2]arr2[3][3]

当然,我不会给你确切的代码,因为这显然是一项学习任务。但是我会告诉你,如果你有一个i用于外部循环的计数器和一个j用于内部循环的计数器,那么中间数组中的索引将取决于两者ij

于 2013-10-29T07:27:10.843 回答
0

好吧,假设您有二维数组(您可以轻松地将一维更改为二维) PseudoCode :

whereToGo = RIGHT;
i = 0;
j = 0;

maxX = WIDTH;
maxY = HEIGHT;
minX = 0;
minY = 0;

while (somethingLeft){
  addNumberToPyramid(array[i][j]);
  if (whereToGo == RIGHT){
    i++;
    if (maxX == i) {
      whereToGo = DOWN;
      minY++;
    }
  } else if (whereToGo == DOWN){
    //Same as if you go RIGHT, but increasing "j", at the end, you decrease maxY and then goLeft
  } //... other two directions
}

这就是解析输入的方法。将其添加到金字塔的类似方法。我宁愿创建另一个二维数组,将其作为金字塔直接放在那里,然后编写正确打印此数组的方法:

public class Pyramid{
  //initialize minX, maxX etc.
  int[][] array;
  whereToGo = DOWN;
  int i = 0, j = 0;

  //initialize array size in constructor

  public void addNumberToPyramid(int value){
    if (whereToGo == DOWN){
      array[i][j] == value;
      j++;
      if (j == maxY){
        whereToGo = UPRIGHT;
        maxY -= 2;
      } else if (whereToGo == UPRIGHT){
      } //... other else if directions
    }    
  }
}
于 2013-10-29T07:30:12.143 回答
0

我认为这应该工作你迭代 2 次。首先你得到第一行和它下面的所有对角线行,然后是最后一行和它上面的所有对角线行。您必须创建第二个数组来保存此信息。我假设 X 和 Y 的数组大小相同。使用 4x4 数据(您的数据)测试的 7x7、4x4 等

String[][] array2 = new String[array.length*2][array.length];

for (int mb = 0; mb < array.length; mb++) {
    String p1 = array[0][mb];  

     array2[mb][0] = p1;
     int count = 0;
     for (int i=1;i<=mb;i++) {
         count++;
         String p2 = array[i][mb-i];
         array2[mb][count] = p2;
     }
} 

int counter = -1;
for (int mb = array.length -1; mb > 0; mb--) { 
    counter++;
    String p1 = array[array.length -1][mb];  

    array2[mb+array.length -1][counter] = p1;
    for (int i=0;i<counter;i++) {
        String p2 = array[array.length -2 - i][array.length -counter + i];
        array2[mb+array.length -1][i] = p2;
    }
} 
于 2013-10-29T09:32:17.783 回答