Java面試題一道,據說90%的程序員答不上來

前兩天發出來一道面試題:打印平行四邊型,今天把解題思路放出來。

先複習一下題目:

題目要求:

輸入一個數字,打印出如下平行四邊形。
在這裏插入圖片描述

圖形規則:

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+" ");
    	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章