`
zeyuphoenix
  • 浏览: 57933 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

收集面试题(十五)(生成杨辉三角)

阅读更多

使用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.zip

    标题中的“python-leetcode面试题解之第119题杨辉三角II”指的是一个关于Python编程语言在LeetCode平台上解决面试题目的资源,特别是针对第119题的杨辉三角形问题的第二部分。LeetCode是一个在线平台,提供各种编程...

    华为-华为od题库练习题之杨辉三角的变形.zip

    1. **存储与生成**:题目可能要求实现一个算法,根据给定的行数生成杨辉三角的前n行,这涉及到数组或链表的数据结构和动态规划的思想。 2. **查找特定值**:查找杨辉三角中特定位置的数,或者找到某个数出现的所有...

    python-leetcode面试题解之第118题杨辉三角-题解.zip

    本题解将深入探讨LeetCode中的第118题——“杨辉三角”。 “杨辉三角”(Pascal's Triangle)是数学中的一个重要概念,它的每一行都是一个等差数列的和,而且每个数字都是它正上方两个数字的和。在Python中实现杨辉...

    java开发面试题 100页 20220709

    Java开发面试题涵盖了许多核心知识点,包括数据库优化、SQL查询、事务处理、数据类型、查询性能分析、并发控制、数据库操作、JDBC、大数据处理、索引、存储过程、视图、数据库性能优化、Java运算符、循环结构、跳转...

    手稿_V1.060

    题目是生成杨辉三角的前`numRows`行,这是一个经典的计算机科学问题,常用于考察程序员对递推关系的理解以及数组处理能力。 1. **动态规划**: 动态规划是一种解决问题的方法,它通过将复杂问题分解为更小的子问题...

    组合数学习题及答案 rechard

    3. **杨辉三角**:解释杨辉三角(Pascal's Triangle)如何生成二项式系数,并通过其结构发现组合数的对称性和其他规律。 4. **鸽巢原理**:讲解鸽巢原理(Dirichlet's Principle),用于解决分配问题和存在性问题,...

    leetcode数组下标大于间距-Leetcode:Leetcode做题记录

    面试题 05.06. 整数转换 1 两数之和 3 无重复字符的最长子串 5 最长回文子串 7 整数反转 8 字符串转换整数 (atoi) 9 回文数 14 最长公共前缀 19 删除链表的倒数第N个节点 20 有效的括号 21 合并两个有序链表 22 括号...

    南邮上机报告

    - 目标:输出相应阶次的杨辉三角 - 输出:杨辉三角 - **R004H:过河问题** - 输入:人、羊、狼、白菜 - 目标:设计过河方案,避免羊和狼、羊和白菜单独在一起 - 输出:过河步骤 - **R005M:级数问题** - ...

    java测试代码

    - 循环结构:使用嵌套的 `for` 循环生成杨辉三角的每一行。 11. **数字翻转(Number Reversal)** - **描述**:题目要求反转一个数字。 - **知识点**: - 数字处理:使用数学运算(如模运算和除法)来逐个获取...

Global site tag (gtag.js) - Google Analytics