大家好,我是指北君,技术面试搞定了,你们代码能力过关了吗?是不是被大厂的笔试给挡在了门外,不要灰心指北君将陆续为大家带来超强的习题练习。
题目
计算有理数的不可约结果
输入
输入一组分数,通过二维整数数组表示:[ [n_1, d_1],[n_2, d_2], …, [n_n, d_n] ], 表示n_1/d_1, n_2/d_2, … 分子分母都为正整数,计算分数之和,并且结果必须是不可约。
输出
- “[N, D]”
- 如果结果可以被整除,则返回整数:”N”
- 如果输入为空,或者不合法,返回null
输出样例
[ [1, 2], [1, 3], [1, 4] ] –> [13, 12]
代码模板
1 |
|
测试用例样例
1 |
|
题目分析
1.分数之和,需要计算两个分数的分母的最小公倍数,分母相同后,分子进行相加。 2.求最小公倍数,需要求两个数的最大公约数,然后两个数的乘积除以最大公约数。 3.求最大公约数的方法很多,最容易理解的就是分解质因数,然后将相同的质因数相乘
代码验证(在线)
预留
代码示例
初级实现
实现逻辑基本按照前面的题目分析,最大公约数方式有:【质因数分解法】【短除法】【*辗转相除法】【更相减损法】,这里选用的短除法
1 |
|
中级实现
中级版本实现,优化代码,引入Stream流处理
1 |
|
高阶实现
中级版的实现是不是已经很精简了呢?还不够,我们来看看高级版实现,
- 引入BigInteger.gcd方法计算最大公约数,
- 过程中不再转换(好处是逻辑的简单,坏处是有可能乘积越界)。
最后看到代码是不是很震撼!
1 |
|
完整验证用例
因为在线练习没有开通,所有这里临时将完整验证用例附上,小伙伴可以用这些用例来验证自己的实现。
1 |
|
总结
如果对指北君的习题练习感兴趣,也希望在面临大厂笔试时更有信心,可以在公众号中回复:笔试 或者 笔试-编号
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!