「每日LeetCode」2021年6月6日

本文最后更新于:2023年3月19日 晚上

LCP 02. 分式化简

LCP 02. 分式化简

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

连分数是形如上图的分式。在本题中,所有系数都是大于等于 0 的整数。
  输入的cont代表连分数的系数(cont[0]代表上图的a,以此类推)。返回一个长度为 2 的数组[n, m],使得连分数的值等于n / m,且n, m最大公约数为 1。

示例 1:

1
2
3
输入:cont = [3, 2, 0, 2]
输出:[13, 4]
解释:原连分数等价于3 + (1 / (2 + (1 / (0 + 1 / 2))))。注意[26, 8], [-13, -4]都不是正确答案。

示例 2:

1
2
3
输入:cont = [0, 0, 3]
输出:[3, 1]
解释:如果答案是整数,令分母为1即可。

限制:

  1. cont[i] >= 0
  2. 1 <= cont的长度 <= 10
  3. cont最后一个元素不等于 0
  4. 答案的n, m的取值都能被 32 位 int 整型存下(即不超过2 ^ 31 - 1)。

思路

从最后开始取两项,将公式 1/ (a+(c/b)),只看分母部分,化简为(a*b+c)/b,分别存储每一步的分子分母到 prev 中,直到计算完整个式子返回。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} cont
* @return {number[]}
*/
var fraction = function (cont) {
const getNum = ([a = 0, b = 0, c = 0]) => [+a * +b + +c, +b];
let prev = getNum([...cont.splice(-2, 2), 1]);
while (cont.length) {
const num = cont.splice(-1, 1);
prev = getNum([...num, ...prev]);
}
return prev;
};