问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
自身分析:
感觉这道题对于我来说还是有难度的,自身对二维数组陌生..导致将此题难度无限放大,因此当天只是开个头,怎样思考都没有思路,直接选择了先放弃,过些时日再来解答.过了一天,换了一道题 审美课, 这题依然用到了二维数组,没办法,只能去百度搜关于二维数组的相关知识,经过半天时间,终于写出来了,尽管由于写的代码太烂,运行超时,但结果是出来了,先不谈.
回过头在做这道题,感觉没有了当时的恐惧感.在仔细分析,找到规律,慢慢就写出来了.
题目分析:
看题目中的两个提示点,一个是(a+b)i的展开式的系数,对于这个实在无从下手,另外一个三角形中的每个数字等于它两肩上的数字相加.就是这个,在看草稿中的二维数组角标,就可以看到规律,每行除了开头和结尾,其余角标的值等于当前行-1的相同角标+当前行-1的角标-1.这就是关键点,基本该题大概思路就有了.
草稿
源代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] pas = new int[n][];
for (int i = 0; i < pas.length; i++) {
pas[i] = new int[i+1];// 每行列数等于行数
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < i+1; j++) {
if(j==0){ // 每行的首元素为1
pas[i][0] = 1;
} else if(j==i){ // 每行的尾元素为1
pas[i][i] = 1;
}else{
pas[i][j]=pas[i-1][j]+pas[i-1][j-1]; //此处为规律的体现
}
}
}
for (int i = 0; i < pas.length; i++) {
for (int j = 0; j < pas[i].length; j++) {
System.out.print(pas[i][j]+" ");
}
System.out.println();
}
}
}
代码优化:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] pas = new int[n][];
for (int i = 0; i < n; i++) {
pas[i] = new int[i+1];
for (int j = 0; j < i+1; j++) {
if(j==0||j==i){
pas[i][j] = 1;
}else{
pas[i][j]=pas[i-1][j]+pas[i-1][j-1];
}
System.out.print(pas[i][j]+" ");
}
System.out.println();
}
}
}
总结:
写完后,浏览了别人的代码,其中一个可以说思路基本相似,但是代码比我更精简,自身代码冗余的原因是对双重for循环的理解过于死板,导致代码的重复使用,本来一个双重for循环就可以解决自己却用了三个才做出来.
对于代码长度确实减少了,也减少了for循环的遍历,省去了两次for循环.尽管省去了for循环的次数,对于系统消耗的时间以及占用内存的使用,由检验并未减少时间以及占用...
具体原因以后在探明..
参考: 作者 -- sytandxly -- 基础练习 杨辉三角形 java