本文主要是介绍跟LintCode的算法题杠上了(2424输出杨辉三角),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
你的代码需要从标准输入流(控制台)中读入一个正整数 n,然后计算出前 n 行的杨辉三角并将结果打印到标准输出流(控制台)中。
样例
评测机会将整个项目的代码编译为一个可执行的 Main 程序,并按照这样的方式执行你的代码 Main。你的代码需要从标准输入流(控制台)中读入数据 n,并将前 n 行的杨辉三角打印到标准输出流(控制台)中。输出格式见样例。
样例一
* 你的代码需要从标准输入流(控制台)中读入一个正整数 n,* 然后计算出前 n 行的杨辉三角并将结果打印到标准输出流(控制台)中。** 1≤n≤20** 当 n = 3 时,程序执行打印出的结果为:** 1* 1 1* 1 2 1** 当 n = 4 时,程序执行打印出的结果为:** 1* 1 1* 1 2 1* 1 3 3 1** 当 n = 5 时,程序执行打印出的结果为:** 1* 1 1* 1 2 1* 1 3 3 1* 1 4 6 4 1** 当 n = 6 时,程序执行打印出的结果为:** 1* 1 1* 1 2 1* 1 3 3 1* 1 4 6 4 1* 1 5 10 10 5 1
思路
杨辉三角的规律
1.头和尾都是1
2.下一行的数=上一行相邻2个数之和
3.每一行的个数 = 行数
找到这个规律之后就有了解题思路了,
把上一行 相邻的2个数相加就等于下一行的数字(头尾都是1除外)
//获取控制台输入
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();//记录上一行的数字,从第2行开始记录
List<Integer> arr_up = new ArrayList();//记录当前行的数字,从第3行开始记录
List<Integer> arr_down = new ArrayList();
for(int i = 1; i <= n; i ++){for(int k = 1; k <= i; k ++){if(i == 1){//当第1行直接输出1System.out.print(1);}else if(i == 2){//当第2行直接输出1,和空格System.out.print(1);if(k < 2){System.out.print(" ");}arr_up.add(1);}else{//从第3行开始,就要把上一行相邻的数字相加,并记录下来,当做第4行的上一行,以此类推if(k == 1){//每行的第一个数字 是1System.out.print(1);System.out.print(" ");}else{int g = 0;if(i % 2 == 0){//偶数行,先把第一个1 放入listarr_up.add(1);for(int m = 0; m < (arr_down.size() - 1); m ++){System.out.print(arr_down.get(m) + arr_down.get(m + 1));System.out.print(" ");//把上一行相邻2 个数之和 放入 listarr_up.add(arr_down.get(m) + arr_down.get(m + 1));}//把最后一个1 放入listarr_up.add(1);//每次放完list 之后需要把上一行的数据清空,用来记录下一行arr_down.clear();}else{//奇数行,先把第一个1 放入listarr_down.add(1);for(int m = 0; m < (arr_up.size() - 1); m ++){System.out.print(arr_up.get(m) + arr_up.get(m + 1));System.out.print(" ");//把上一行相邻2 个数之和 放入 listarr_down.add(arr_up.get(m) + arr_up.get(m + 1));}//把最后一个1 放入listarr_down.add(1);//每次放完list 之后需要把上一行的数据清空,用来记录下一行arr_up.clear();}//每行的最后一个数字 是1System.out.print(1);//这里一定要跳出循环,进入下一行循环break;}}}System.out.println("");
}
思考
这个题目其实还有更简单的做法,用一维数组实现,不用list,时间和空间复杂度能优化
这篇关于跟LintCode的算法题杠上了(2424输出杨辉三角)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!