前兩天發出來一道面試題:打印平行四邊型,今天把解題思路放出來。
先複習一下題目:
題目要求:
輸入一個數字,打印出如下平行四邊形。
圖形規則:
1、數字中心對稱。
2、平行四邊形的一半是這樣的規則
除第一列以外,每個數字等於它左邊的數字+它左上角的數字
1+3=4
3+5=8
4+8=12
下面來看解題思路
題目規律
需要打印出的結果中數字存在下面這樣的規律:
1、平等四邊形中心對稱。
2、中心列是1,3,5,7,9
3、右邊的三角形中的數字等於左側數字+左上角的數字之和。
4、數字要排整齊,需要用空格補齊較小的數字。
解題思路
這個題目還是稍有點難度的,算法大牛可能首先會考慮用遞歸算法搞定,那個難度有點大,不好理解,我們還是先用簡單一點的辦法試試。
首先可以用到的就是二維數組。只要能把數字計算出來放到二維數組裏面,打印就不是難事了。
下面來分析一下數字的關係,首先四邊形圖形的中心兩列是反轉的。
但是放到二維數組中就變成了下面這樣的關係了:
所以二維數組可以先把這兩組的值確定下來。然後再往兩邊看:
1+3 = 4, 3+5 = 8, 5+7 = 12。往兩邊的第二列等於那個位置左邊的數字加左上解的數字之和。
在二維數組裏的關係則是:
再往外側擴散是一樣的道理,直到最左上角和最右下角的數字計算出來。
最後一個問題就是打印的問題了,要想打印整齊,每個數字佔的字符數要以整個數組中最大的數字長度爲準,這個比較簡單,就不細說了。至止,解題思路已經出來了。
解題步驟
1、定義二維數組。
2、給中心列賦值。
3、從中心列開始向兩側依次計算。
4、打印數組。
代碼:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入一個數字:");
int c = sc.nextInt();;
int size = (c+1)/2;
int[][] array = new int[size][size+1];
//先給中心列賦值:1,3,5,7,9
for (int i = 0,j=size; i < size; i++,j--) {
array[i][j] = i*2+1;
array[size-1-i][size-j] = i*2+1;
}
//從中心列開始往兩邊計算
for (int k = 1; k <= size; k++) {
for (int i = k-1,j=size; i < size-1; i++,j--) {
//計算中心列右邊的值
array[i+1][j]=array[i][j] + array[i+1][j-1];
//計算中心列左邊的值
array[size-i-2][size-j]=array[i][j] + array[i+1][j-1];
}
}
printArray(array);
}
//打印空格
public static void printSpace(int len){
for (int i = 0; i < len; i++) {
System.out.print(" ");
}
System.out.print(" ");
}
//打印數組
public static void printArray(int[][] array){
int size = (""+array[0][0]).toString().length();//計算出最大的數字長度
for (int i = 0; i < array.length; i++) {
//打印每行之前,先打印空位
for (int j = 0; j < i; j++) {
printSpace(size);
}
for (int j = 0; j < array[i].length; j++) {
printNumber(array[i][j],size);
}
System.out.println();
}
}
//格式化打印數字,按最大的數字所佔的位數打印
public static void printNumber(int num,int size){
int len = (""+num).toString().length();
for (; len < size; len++) {
System.out.print(" ");
}
System.out.print(num+" ");
}