打印杨辉三角
今天面试遇到的一道老题目,打印出杨辉三角,面试的时候我的解法没有让自己满意,回来后又改了些版本,我也看了下网上的方法,这里我提供一个不一样的思路,以面向对象的思想去解决这个问题,我把整个杨辉三角作为对象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 }
欢迎批评指正。

浙公网安备 33010602011771号