2014-09-02 3 views
-1

Мне довелось появиться для теста и получили следующее в качестве вопроса. Я не могу понять, как действовать. Сценарий, чтобы написать программу Java, которая печатает следующую с соответствующими N. Если предположим, что N = 3, он должен иметь 2 * N строк и выход должен быть,Генерация зеркального треугольника в java

2 * 3
4 * 5 * 6
4 * 5 * 6
2 * 3

Выход должен состоять только цифры и звездочки. N колеблется в пределах от 0 до 100. Кроме того, учитывая

public static void main(String[] args){ 
    int rows=2; 
    mirrorTriangle(rows); 
} 
public void mirrorTriangle(int n){ 
    //Logic 
} 

Я не понимаю, почему это строки объявлены 2, если строки должны быть разной с N. Пожалуйста, объясните логику.

+1

домашнее задание ?? любая проблема с кодом, который вы пишете? – VinayVeluri

+0

Пришел к этому в процессе собеседования. Я не знаю, чтобы продолжить. – Chandni

+0

Если 'given' означает, что вы можете написать свой код только там, где' // Logic', чем вы неправильно поняли/забыли что-то. Это не имеет смысла (и проблема невозможна). Точная постановка проблемы может быть полезна.Если это всего лишь пример структуры кода - да, ответ будет выглядеть примерно так, и нечего объяснять. – Deltharis

ответ

1

Решение проблемы с описанием проблемы.

public static void main(String[] args) throws Exception 
    { 
     // initialize n 
     int n = 4; 
     // initialize x to 1 from where our printing will start. 
     int x = 1; 
     /* We will store our generated numbers in an array. 
     * For example, the array after we generate 
     * the numbers would look like: 
     * [1,0,0, 
      2,3,0, 
      4,5,6, 
      4,5,6, 
      2,3,0, 
      1,0,0] 
     * 
     * When n = 3, there are going to be 3*2 i.e, n*2 rows. 
     * in our case 6 rows. 
     * visualize with the above values. 
     * The first n/2 rows will be the numbers we print, 
     * the next n/2 will be the mirror image of the first n/2 rows. 
     * no. of columns in each row will be equal to n, in our example:3 
     */ 
     int arr[][] = new int[n*2][n]; 
     /* 
     * Start populating the matrix 
     * Each row will contain number of elements eaual to the row number, 
     * so 1st row -> 1 element, 2nd - > 2,.. and so on. 
     */ 
     for(int row=0;row<n;row++) 
     { 
      int col = 0; 
      while(col < row+1) 
      { 
       arr[row][col] = arr[n*2-row-1][col] = x++; 
       col++; 
      } 
     } 
     /* 
     * Now our task is just to read out the array. 
     * The tricky part is adding the astricks. 
     * We notice that row1 will have 1-1 asticks, row2 -> 2-1 astricks ,.. and so on. 
     * So in between the numbers while reading out, 
     * for each row we maintain the number of astricks. 
     */ 
     for(int i=0;i<arr.length;i++) 
     { 
      StringBuilder build = new StringBuilder(); 
      for(int j=0;j<arr[i].length;j++) 
      { 
       if(arr[i][j] > 0) 
       { 
        build.append((arr[i][j])).append("*"); 
       } 
      } 
      System.out.print(build.delete(build.length()-1,build.length()).toString()); 
      System.out.println(); 
     } 
    } 

о: р при п = 4:

1 
2*3 
4*5*6 
7*8*9*10 
7*8*9*10 
4*5*6 
2*3 
1 
+0

Спасибо! Разработаны! – Chandni

1
def N = 3 
def i = 0 
def j = 0 
int[][] numbers = new int[N][] 

// Generate, print, and store numbers 
while(i < numbers.length){ 
    numbers[i] = new int[i+1] 
    j = 0 
    while(j < numbers[i].length){ 
     numbers[i][j] = j+1 
     ++j 
     print j 
    } 
    println "" 
    i++ 
} 

// Print them again, in reverse order 
i = numbers.length - 1 
while(i >= 0){ 
    j = 0 
    while(j < numbers[i].length){ 
     print numbers[i][j] 
     j++ 
    } 
    println "" 
    i-- 
} 

Выход:

1 
12 
123 
123 
12 
1 

код довольно понятно. Вам нужно всего лишь N строк, но напечатайте 2N, потому что, подождите ... симметрия. Если у вас 6 строк, первые 3 являются новыми, а остальные 3 - только зеркальными изображениями, поэтому зачем тратить пространство памяти, когда вы можете просто распечатать их снова?

+1

Вниз проголосовали за то, что не отображали звездочки ;-) – BatScream

+0

@BatScream * Крики * dafuq? LOL Идея состояла в том, чтобы позволить ОП понять это. Я рад, что вы не можете голосовать дважды. См. Последовательность чисел, которые я использую. Это отличается от того, что хочет OP;) –

+0

Пожелайте, чтобы у меня была возможность снова проголосовать, никаких комментариев в коде, запрошенных OP. Во всяком случае, оптимизация памяти хорошая. – BatScream

0

существует явное требование рекурсии? Это подразумевает структура проблемы, которая не упоминается нигде.

int rows=2 является примером, вероятно, для целей данной проблемы вы не можете делать ничего «умные» как с помощью указателей ...

Я также предполагаю, что вы не разрешается использовать значения «> 100 ', чтобы вы могли перегрузить значение значения n - то же самое относится к дополнению 2.

Если учесть цикл, в качестве замены для рекурсии вы можете генерировать треугольник без необходимости сохранять состояние за пределами стека:

public static void main(String[] args){ 
    int rows=3; 
    mirrorTriangle(rows); 
} 

public static void mirrorTriangle(int n){ 

    for (int i = 0 ; i < n + 1 ; i++) { 

     renderLine(i); 
    } 

    for (int i = n ; i > 0 ; i--) { 

     renderLine(i); 
    } 
} 

private static void renderLine(int n) { 

    int j = n * (n - 1)/2 + 1; 
    int k = j + n; 

    while (j < k) { 

     System.out.print(j); 
     j++; 
     if (j < k) System.out.print('*'); 
    } 

    System.out.println(); 
} 
0

Попробуйте этот свежий код:

public class String4 {  
    public static void main(String[] args) {  
     int rows = 3;  
     mirrorTriangle(rows);  
    }  
    private static void mirrorTriangle(int rows) {  
     for(int i=1;i<=rows;i++)  
     {  
      for(int j=1;j<=i;j++)  
      {  
       System.out.print(i);  
       if(j>0&&j<i)  
       System.out.print("*");  
      }  
      System.out.println();  
     }  
     for(int k=rows;k>0;k--)  
     {  
      for(int l=1;l<=k;l++)  
      {  
       System.out.print(k);  
       if(l>0&&l<k)  
        System.out.print("*");  
      }  
      System.out.println();  
     }  
    }  
} 

Выход :

 
1  
2*2  
3*3*3  
3*3*3  
2*2  
1 
+0

Код имеет отступы на 4 пробела на StackOverflow. Вы можете выбрать код и нажать Ctrl + K, чтобы одновременно отложить его. –

0

Я думаю, что это лучшее и простое решение, чем выбранное.

public static void main(String[] args) { 
    Scanner s = new Scanner(System.in); 
    System.out.println("Enter limit"); 
    int limit = s.nextInt(); 
    int start[] = new int[limit]; 
    int v = 1; 
    for (int i=1; i<=limit; i++) { 
     start[i-1] = v; 
      for (int j=1; j<=i; j++) { 
       System.out.print(v++); 
       if(j==i) 
        continue; 
       System.out.print("*"); 
      } 
      System.out.print("\n"); 
    } 
    for (int i=limit-1; i>=0; i--) { 
     v=start[i]; 
      for (int j=i; j>=0; j--) { 
       System.out.print(v++); 
       if(j==0) 
        continue; 
       System.out.print("*"); 
      } 
      System.out.print("\n"); 
    } 
} 
Смежные вопросы