使用java数组来实现杨辉三角,要求内存空间开辟越小越好
/**
* The Class YangHuiTriangle.
*/
public class YangHuiTriangle {
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
new YangHuiTriangle().printYanghuiTriangle(10);
}
/**
* 生成指定行数的杨辉三角形
*
* @param lines
* 杨辉三角形的行数
*/
public void printYanghuiTriangle(int lines) {
if (lines < 1) {
throw new IllegalArgumentException("lines must be great than 0.");
}
if (lines > 30) {
throw new IllegalArgumentException("lines is too big.");
}
int[] line = new int[lines];
int maxLen = getMaxLen(lines);
for (int i = 0; i < lines; i++) {
line[0] = line[i] = 1;
for (int j = 1, k = i / 2, pre = line[0]; j <= k; j++) {
int cur = line[j];
line[i - j] = line[j] += pre;
pre = cur;
}
printLine(line, i + 1, maxLen);
}
}
/**
* 根据指定行数的杨辉三角形,计算其中最大数字的长度
*
* @param lines
* 杨辉三角形的行数
* @return 最大数字的长度
*/
private int getMaxLen(int lines) {
int k = lines / 2;
long maxNum = factorial(k + 1, lines - 1) / factorial(1, lines - 1 - k);
return getNumLength(maxNum);
}
/**
* 阶乘计算
*
* @param start
* 阶乘计算的起始数字
* @param num
* 阶乘计算的终止数字
* @return 阶乘计算结果
*/
private long factorial(int start, int end) {
long result = start > 0 ? start : 1L;
while (end > start) {
result *= end--;
}
return result;
}
/**
* 根据指定数字计算数字的长度
*
* @param number
* 数字
* @return 数字的长度
*/
private int getNumLength(long number) {
int length = 0;
while (number > 0L) {
number /= 10L;
length++;
}
return length;
}
private void printLine(int[] yanghui, int line, int width) {
printSpaces((yanghui.length - line) * width);
for (int i = 0; i < line; i++) {
if (i > 0) {
printSpaces(width);
}
printSpaces(width - getNumLength(yanghui[i]));
System.out.print(yanghui[i]);
}
System.out.println();
if (width > 1) {
System.out.println();
}
}
private void printSpaces(int spaceCount) {
for (int i = 0; i < spaceCount; i++) {
System.out.print(" ");
}
}
}
分享到:
相关推荐
标题中的“python-leetcode面试题解之第119题杨辉三角II”指的是一个关于Python编程语言在LeetCode平台上解决面试题目的资源,特别是针对第119题的杨辉三角形问题的第二部分。LeetCode是一个在线平台,提供各种编程...
1. **存储与生成**:题目可能要求实现一个算法,根据给定的行数生成杨辉三角的前n行,这涉及到数组或链表的数据结构和动态规划的思想。 2. **查找特定值**:查找杨辉三角中特定位置的数,或者找到某个数出现的所有...
本题解将深入探讨LeetCode中的第118题——“杨辉三角”。 “杨辉三角”(Pascal's Triangle)是数学中的一个重要概念,它的每一行都是一个等差数列的和,而且每个数字都是它正上方两个数字的和。在Python中实现杨辉...
Java开发面试题涵盖了许多核心知识点,包括数据库优化、SQL查询、事务处理、数据类型、查询性能分析、并发控制、数据库操作、JDBC、大数据处理、索引、存储过程、视图、数据库性能优化、Java运算符、循环结构、跳转...
题目是生成杨辉三角的前`numRows`行,这是一个经典的计算机科学问题,常用于考察程序员对递推关系的理解以及数组处理能力。 1. **动态规划**: 动态规划是一种解决问题的方法,它通过将复杂问题分解为更小的子问题...
3. **杨辉三角**:解释杨辉三角(Pascal's Triangle)如何生成二项式系数,并通过其结构发现组合数的对称性和其他规律。 4. **鸽巢原理**:讲解鸽巢原理(Dirichlet's Principle),用于解决分配问题和存在性问题,...
面试题 05.06. 整数转换 1 两数之和 3 无重复字符的最长子串 5 最长回文子串 7 整数反转 8 字符串转换整数 (atoi) 9 回文数 14 最长公共前缀 19 删除链表的倒数第N个节点 20 有效的括号 21 合并两个有序链表 22 括号...
- 目标:输出相应阶次的杨辉三角 - 输出:杨辉三角 - **R004H:过河问题** - 输入:人、羊、狼、白菜 - 目标:设计过河方案,避免羊和狼、羊和白菜单独在一起 - 输出:过河步骤 - **R005M:级数问题** - ...
- 循环结构:使用嵌套的 `for` 循环生成杨辉三角的每一行。 11. **数字翻转(Number Reversal)** - **描述**:题目要求反转一个数字。 - **知识点**: - 数字处理:使用数学运算(如模运算和除法)来逐个获取...