分式化简

149 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

说在前面

🎈每天进行一道算法题目练习,今天的题目是“分式化简”。

问题描述

有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?

image.png

连分数是形如上图的分式。在本题中,所有系数都是大于等于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的取值都能被32int整型存下(即不超过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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。