打印杨辉三角

今天面试遇到的一道老题目,打印出杨辉三角,面试的时候我的解法没有让自己满意,回来后又改了些版本,我也看了下网上的方法,这里我提供一个不一样的思路,以面向对象的思想去解决这个问题,我把整个杨辉三角作为对象YangHuiTriangle,每一行的内容作为对象YangHuiRow,Triangle由Row组成,有多少行的内容就有多少个YangHuiRow对象,这样思路比较清晰,我比较满意我的这个解决方法,拿出来和大家分享一下。

YangHuiRow我是这么设计的,由于杨辉三角的每一行都是左右对称的,所以可以用两个集合对象去存储左右两边的数字,而打印的时候总是从左至右,那么左边前进先出应该用队列,右边先进后出则用栈去解决,而又因为有奇数行和偶数行的关系,所以我添加了一个整型变量用来存储奇数行的中间数字,整体的一个思路就是这样子的。

下面是YangHuiRow的代码:

 1 public class YangHuiRow {
 2     private int rowIndex;
 3     private Queue<Integer> left = new LinkedList<Integer>();
 4     private int middle;
 5     private Stack<Integer> right = new Stack<Integer>();
 6 
 7     public void insert(int num) {
 8         left.offer(num);
 9         right.push(num);
10     }
11 
12     public YangHuiRow(int rowIndex) {
13         this.rowIndex = rowIndex;
14         if (rowIndex == 1) {
15             middle = 1;
16         } else {
17             insert(1);
18         }
19     }
20 
21     public void setAboveRow(YangHuiRow aboveRow) throws Throwable {
22         rowIndex = aboveRow.getRowIndex() + 1;
23         clear();
24         int index = 0;
25         int[] nums = aboveRow.getNums();
26         if (aboveRow.isOdd() && !isOdd()) {
27             for (int i = 0; i < aboveRow.size() / 2; i++) {
28                 insert(nums[index] + nums[++index]);
29             }
30         } else if (!aboveRow.isOdd() && isOdd()) {
31             for (int i = 1; i < aboveRow.size() / 2; i++) {
32                 insert(nums[index] + nums[++index]);
33             }
34             middle = (nums[index] + nums[++index]);
35         } else {
36             throw new Throwable("error");
37         }
38     }
39 
40     public boolean isOdd() {
41         return rowIndex % 2 == 1;
42     }
43 
44     @SuppressWarnings("unchecked")
45     public int[] getNums() {
46         int[] arr = new int[size()];
47         int i = 0;
48         Queue<Integer> l = (Queue<Integer>) ((LinkedList<Integer>) left)
49                 .clone();
50         Stack<Integer> r = (Stack<Integer>) right.clone();
51         while (l.size() > 0) {
52             arr[i++] = l.poll();
53         }
54         if (isOdd()) {
55             arr[i++] = middle;
56         }
57         while (r.size() > 0) {
58             arr[i++] = r.pop();
59         }
60         return arr;
61     }
62 
63     public int size() {
64         return (this.isOdd() ? 1 : 0) + left.size() + right.size();
65     }
66 
67     public int getRowIndex() {
68         return rowIndex;
69     }
70 
71     @Override
72     public String toString() {
73         StringBuilder sb = new StringBuilder();
74         for (Integer i : getNums()) {
75             sb.append(i + " ");
76         }
77         return sb.toString();
78     }
79 
80     public void clear() {
81         left.clear();
82         right.clear();
83         if (rowIndex == 1) {
84             middle = 1;
85         } else {
86             insert(1);
87         }
88     }
89 }

 

 下面是YangHuiTriangle的代码:

 1 public class YangHuiTriangle {
 2     private Stack<YangHuiRow> rows = new Stack<YangHuiRow>();
 3 
 4     public YangHuiTriangle(int rowCount) throws Throwable {
 5         if (rowCount < 3) {
 6             throw new Throwable("row count must be bigger than 2");
 7         }
 8         rows.add(new YangHuiRow(1));
 9         rows.add(new YangHuiRow(2));
10         for (int i = 2; i < rowCount; i++) {
11             YangHuiRow newRow = new YangHuiRow(rows.size() + 1);
12             newRow.setAboveRow(rows.peek());
13             rows.push(newRow);
14         }
15     }
16 
17     public void printRows() {
18         for (YangHuiRow r : rows) {
19             for (int i = 0; i < rows.size() - r.getRowIndex(); i++)
20                 System.out.print("  ");
21             System.out.println(r.toString());
22         }
23     }
24 
25     public static void main(String[] args) {
26         try {
27             new YangHuiTriangle(12).printRows();
28         } catch (Throwable e) {
29             e.printStackTrace();
30         }
31     }
32 }

 

欢迎批评指正。

 

posted @ 2014-11-12 00:54  clearfxxk  阅读(235)  评论(0)    收藏  举报