2012-09-04 55 views
6

中の数字のピラミッドは、このようなものになります -私は、Java でピラミッドを印刷しようとしていたJava

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

を私は、インターネット上でこれを解決する方法を探していたと私はこれに出くわし:

class Pyramid { 

    public static void main(String[] args) { 

    int x = 7; 

    for (int i = 1; i <= x; i++) { 

     for (int j = 1; j <= x - i; j++) 
      System.out.print(" "); 

     for (int k = i; k >= 1; k--) 
      System.out.print((k >= 10) ?+ k : " " + k); 

     for (int k = 2; k <=i; k++) 
      System.out.print((k >= 10) ?+ k : " " + k); 
     System.out.println(); 
    } 
    } 
} 

誰でも私に理解してもらえますか? ここで私が考え出したのは - 外側のループは7までインクリメントし、同時に内側のjループはx-i まで増分します。これは外側のループの最初の反復で6、次に5です。そうです。 基本的にピラミッドの左側は、逆三角の空白です。

場合、私は悩み、他の2つの入れ子のループで何が起こっているのかを考え出すと見ている奇妙なを持っています - print文

+8

三元演算子の仕組みをご存じですか?もしそうでなければ、それを見てください。 if/elseを使用してコードを書き換えて、理解しやすくしてください。あなたの解釈を入れて、あなたのためにそれを確認することができます。 – thatidiotguy

+0

他の2つのループは番号の印刷を処理します。 1つは昇順(1,2,3、...)部分、もう1つは降順部分(9,8、...)です。 –

+0

これについて考えてみると、ここで解決するには2つの問題があります.1つは数字を印刷し、もう1つはパディング(スペース)を印刷することです。問題の分解を使用し、それぞれの問題を個別に解決することで、より良い理解に役立ちます。両方の問題を解決したら、ここで提示した問題を解決するソリューションを統合する必要があります。 – hfontanez

答えて

5

内の他の部分はのステップにより、このステップ見ていきましょう。 すでに分かっているように、xはピラミッドの高さを表す変数です。あなたも正しく分かったとして

そして、最初のループは数字

第二のループは、今の数字の左半分を書きますが、現在の行のインデントを作成しますが、私は右のそれを得た場合は、それを最も高い数字とデクリメントで始まり、3番目のループが再び数字をインクリメントし、探しているものとは少し異なるピラミッドが作成されます。

ここで、あなたが呼んでいるように、奇妙なif-else部分は三項条件演算子です。ピラミッドに数値が含まれているときに番号の間隔を固定するのは、 10の数字の先頭の空白を省略します。 :)

+0

ありがとうございます。それは多くを説明する:) – Ajit

4

これは宿題です。あなたは、他人の仕事を盲目的にコピーするのではなく、自分でやることでもっと学びます。似ていますが、単純な問題で

スタート:

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

あなたはその三角形を印刷できますか?あなた自身のコードを書いて、正しく動作することをテストしてください。

アスタリスクの代わりに番号を印刷するようにコードを変更します。

1 
    123 
    12345 
1234567 

あなたはその三角形を印刷できますか?あなた自身のコードを書いて、正しく動作することをテストしてください。

最終的な問題を解決するには、もう一度コードを修正してください。似たような、しかしより簡単な問題をまず解決することで、困難な問題にアプローチする方が簡単な場合もあります。コードを再利用することで、ソリューションから簡単な問題まで、より複雑なソリューションを構築することができます。

あなたが見つけたコードのアイデアや技術を是非取り入れてください。盲目的にコピーするだけではありません。 自分のコードを、コードから分かりやすいように書きます。

+0

ありがとう。 私は今、それらをやっています – Ajit

1

本当に現実には複雑なタスクの外観が簡単であるため、ここでは

public class Pyramid { 
    public static void main(String[] args) { 

     int[] arry = new int[10]; 
     for (int i = 1; i <= 9; i++) 
      arry[i] = i; 
     int index = 0; 
     for (int i = 9; i > 0; i--) { 
      int loop = 1, tempLoop = 0; 

      for (int k = 0; k < 9; k++) { 
       if (k < (9 - index)) 
        System.out.print(" "); 
       else 
        System.out.print(arry[k] + " "); 
      } 

      for (int k = 9; k >= i && (tempLoop++) <= index; k--){ 
       System.out.print(arry[k] + " "); 
      } 
      index++; 
      System.out.println(); 
     } 
    } 
} 
10

を行きます。それは始まりを見にくいかもしれません。最終結果は、結果を導くルートではなく、あなたが考えているからです。

これを変更するには、古い規則のコーディング(divide and conquer)を使用できます。このapprachは、我々が実行することができる簡単なタスクに主要な問題を減らすことができる複雑な問題の類似点を見つけるために私たちに教えてくれます。言い換えれば、私たちは小さな問題で大きな問題をチャンクしています。それは本当に簡単に解決でき、最終的には小さな結果を大きなものと闘います。

あなたの問題で始まることをお勧めします。

Q1:数字のピタマインダーを印刷するには?

私たちはそれを知らないので、何かに集中することができます。私たちは今、

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

一部bacgroundの詳細を追加することができ、私たちの観察を改善するために

は観測のための時間です。

このような見解から、私たちは以下のアイデアを考え出すことができます。

アイデア:ピラミッドは2つの三角形の構成です。

結論:ピラミッドの半分を書く方が簡単です。だから、酸っぱい問題を言い返すことができます。

Q2:三角形のようなシーケンス番号を書き込むにはどうすればよいですか?

これは本当に単純です。最初のループには2つのループが必要で、行の別の列を担当します。

for(int column = 1; column <= 9; column++) { 
for(int row = 1; row <= 9; row++) { 
    if(column ## row) { // Observe what will happen if we use == or <= or > or <> 
     System.out.print(row); 
    } else { 
    System.out.print(" "); 
    } 
} 
System.out.println(' '); 

}

あなたが最初のタスクを完了すると、あなたはscreean上の数字のsquers、triagles、ラインを印刷することができます。

だから我々はこのような三角形を印刷する方法を知っているとき:

r 

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

我々は、より適切であろうあなたのコードを変更する必要があり、コンピュータの世界では一般的に操作がゼロでないものから始めます。

r 

c 0 1 2 3 4 5 6 7 8 
    0 _ _ _ _ _ _ _ _ 9 
    1 _ _ _ _ _ _ _ 8 9 
    2 _ _ _ _ _ _ 7 8 9 
    3 _ _ _ _ _ 6 7 8 9 
    4 _ _ _ _ 5 6 7 8 9 
    5 _ _ _ 4 5 6 7 8 9 
    6 _ _ 3 4 5 6 7 8 9 
    7 _ 2 3 4 5 6 7 8 9 
    8 1 2 3 4 5 6 7 8 9 

これで成功したら、すぐにやります。

なぜ、各行に対してすべての操作を繰り返す必要がありますか?私たちが何らかの価値を置くことができれば、思考や計算をする必要がなくなるだけで、結果全体を画面に書くことに集中することができます。

この問題の解決策は、dynamic programingとして知られているapporachの配列と概念です。このアプローチでは、我々は未来の操作のために使用される何らかの物を暗記しようとします。

ワームのように、番号を割り当てて印刷する代わりに配列に割り当てるだけです。で

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

、あなたはこの

int[] array = new int[9]; 

    for(int column = array.length; column > 0 ; column--) { 
     for(int row = 0; row <= array.length; row++) { 
      if(column == row) { 
       array[row-1] = column; 
      } 
     } 
     System.out.println(Arrays.toString(array)); 
    } 

のようなコードを思い付いたはずですので、そのコードから明らかであるものを、私たちだけで一つの値を設定し、各段階での使用のためにということです。それは以下に表示されます

9 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [9] -Step one we put nine 
    8 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [8] [ ] -Step two we put eight 
    7 [ ] [ ] [ ] [ ] [ ] [ ] [7] [ ] [ ] 
    6 [ ] [ ] [ ] [ ] [ ] [6] [ ] [ ] [ ] 
    5 [ ] [ ] [ ] [ ] [5] [ ] [ ] [ ] [ ] 
    4 [ ] [ ] [ ] [4] [ ] [ ] [ ] [ ] [ ] 
    3 [ ] [ ] [3] [ ] [ ] [ ] [ ] [ ] [ ] 
    2 [ ] [2] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 
    1 [1] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] 

9つのステップの後、私たちは数字で全体の配列を記入します。

我々がまだ欠けているものは画面上の結果です。そのためには、各ステップで配列全体を出力する必要があります。最初に、左から右へ、それから最初から最後まで印刷してください。

と魔法を行うコードは、他の2つのネストされたループ内でここでは、この

public static void pyramide(int levels) { 

    int[] tab = new int[levels]; 

    for(int row = tab.length; row > 0; row--) { 

     tab[row-1] = row; 

     //Print left 
     for(int i=0; i < tab.length; i++) { 
      if(tab[i] != 0) { 
       System.out.print(tab[i]); 
      } else { 
       System.out.print(' '); 
      } 
     } 
     //Print right 
     for(int i= tab.length-2; i >= row - 1; i--) { 
      if(tab[i] != 0) { 
       System.out.print(tab[i]); 
      } 
     } 

     System.out.println(""); 

    } 

} 
+0

ありがとうございます。 非常に参考になった – Ajit

0

次のようになります。条件k>=10はと表示されますkの値は、その後trueの場合

for (int k = i; k >= 1; k--) 
System.out.print((k >= 10) ?+ k : " " + k); 

for (int k = 2; k <=i; k++) 
System.out.print((k >= 10) ?+ k : " " + k); 

それが偽であれば、kの値をスペースで表示します。

0
public class PrintInterviewPyramid 
{ 
    public static void main(String[] args) 
    { 
      int n=8; 
      for(int i=1;i<n;i=i+2) 
      { 
       for(int j=1;j<i+1;j++) 
       { 
       System.out.println(" "+j);    
       }    
      } 
     System.out.println(""); 
    } 
    } 
0
for (int i = length - 1; i >= 1; i--) 
    { 

     String front = ""; 
     String back = ""; 
     int space = (length - i) - 1; 
     while (space >= 0) { 
      System.out.print(" "); 
      space--; 
     } 
     for (int j = i; j != 0; j--) { 
      front = j + front; 
      if (j != i) { 
       back = back + j; 
      } 
     } 
     System.out.println(front + back); 
    } 
0

二つのパターンを考えてみてください。

最初のパターンは、左右に印刷します。

2番目のパターンは、すべての行を印刷し、印刷開始点でギャップを確認します。

public class NumberPyraimd { 

public static void main(String[] args){ 


    int part = 2; 
    int stage = 5; // set tree stage. 


    if (part == 2){ 
     int cnt = 0; 
     // thinking two part. 
     for (int i = stage; i > 0; i--){ 
      for (int j = 1; j <= stage; j++){ 
       if (stage - j <= cnt){ 
        System.out.print(j+" "); 
       }else{ 
        System.out.print(" "); 
       } 

      } 

      for (int k = stage; k >0 ; k--){ 
       if (k != stage){ 
       if (stage- cnt <= k){ 
        System.out.print(k+" "); 
       }else{ 
        System.out.print(" "); 
       } 
       } 

      } 

      System.out.println(""); 
      cnt++; 
     } 
    }else if (part == 1){// think whole lines. 
     int gap = 0; 

     for (int j = 0; j < stage; j++){ 
      for (int i = 1;i<=stage*2;i++){ 
       if (Math.abs(i-stage) <= gap){ 
        System.out.print(stage-gap+" "); 
       }else 
        System.out.print(" "); 

      } 
      System.out.println(""); 
      gap++; 
     } 
    } 
} 
} 
0

インタビューの潜在的な質問として、これをJava 8のストリームメソッドを使用して実装しようとしたかった。下記の解決策:

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.IntStream; 

public class App { 
    public static void main(String[] args) { 
     int min = 1; 
     int max = 9; 

     List<List<String>> pyramid = new ArrayList<>(); 

     IntStream.iterate(max, i -> i - 1).limit(max) 
       .forEach(s -> { 
        List<String> pyramidRow = new ArrayList<>(); 
        IntStream.rangeClosed(min, max) 
          .forEach(j -> { 
           if (j < s) pyramidRow.add(" "); 
           else pyramidRow.add(String.valueOf(j)); 
          }); 
        IntStream.iterate(max - 1, i -> i - 1).limit(max-1) 
          .forEach(j -> { 
           if (j < s) pyramidRow.add(" "); 
           else pyramidRow.add(String.valueOf(j)); 
          }); 
        pyramid.add(pyramidRow); 
       }); 

     pyramid.stream() 
       .forEach(pyra -> { 
        pyra.forEach(System.out::print); 
        System.out.println(); 
      }); 
    } 
} 
関連する問題