持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
说在前面
🎈每天进行一道算法题目练习,今天的题目是“分式化简”。
问题描述
有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?
连分数是形如上图的分式。在本题中,所有系数都是大于等于0的整数。
输入的cont代表连分数的系数(cont[0]代表上图的a0,以此类推)。返回一个长度为2的数组[n, m],使得连分数的值等于n / m,且n, m最大公约数为1。
示例 1:
输入:cont = [3, 2, 0, 2]
输出:[13, 4]
解释:原连分数等价于3 + (1 / (2 + (1 / (0 + 1 / 2))))。注意[26, 8], [-13, -4]都不是正确答案。
示例 2:
输入:cont = [0, 0, 3]
输出:[3, 1]
解释:如果答案是整数,令分母为1即可。
限制:
cont[i] >= 0
1 <= cont的长度 <= 10
cont最后一个元素不等于0
答案的n, m的取值都能被32位int整型存下(即不超过2 ^ 31 - 1)。
思路分析
首先我们应该先要理解这一个公式,由图片我们可以得到以下公式:
S1 = a0 / 1;
S2 = a0 + 1/a1;
S3 = a0 + 1/(a1 + 1/a2);
.
.
.
知道了这个公式的规律之后,我们就可以开始模拟求值,当前的值会等于上一个元素值加上(当前元素值元素加上后一个元素的倒数)的倒数,如:S2 = a0 + 1/a1,具体步骤如下:
- 1、初始化分子和分母
因为
S1 = a0 / 1,所以我们先初始化分子为数组最后的元素,分母为1;
let numerator = cont.pop();
let denominator = 1;
- 2、根据公式回推出分数 根据公式一步一步往回计算,直到数组全部计算完。
while(cont.length){
const temp = denominator;
denominator = numerator;
numerator = denominator*cont.pop() + temp;
}
AC代码
/**
* @param {number[]} cont
* @return {number[]}
*/
var fraction = function(cont) {
let numerator = cont.pop();
let denominator = 1;
while(cont.length){
const temp = denominator;
denominator = numerator;
numerator = denominator*cont.pop() + temp;
}
return [numerator,denominator];
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。