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

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