Сложность: medium
Дана строка, представляющая выражение сложения и вычитания дробей, верните результат вычисления в строковом формате.
Окончательный результат должен быть несократимой дробью. Если ваш окончательный результат является целым числом, преобразуйте его в формат дроби с знаменателем 1. Таким образом, 2 должно быть преобразовано в 2/1.
Пример:
Input: expression = "-1/2+1/2+1/3"
Output: "1/3"
👨💻 Алгоритм:
1⃣Начните сканирование строки и разделите её на части, содержащие числители и знаменатели, с учетом знаков.
2⃣Выполните операции сложения или вычитания для каждой пары дробей, приводя их к общему знаменателю и сокращая результат.
3⃣Верните результат в виде строки, представляющей несократимую дробь.
😎 Решение:
var fractionAddition = function(expression) {
let sign = [];
if (expression[0] !== '-') sign.push('+');
for (let char of expression) {
if (char === '+' || char === '-') sign.push(char);
}
let fractions = expression.replace(/-/g, '+-').split('+').filter(f => f.length > 0);
let prevNum = 0, prevDen = 1, i = 0;
for (let sub of fractions) {
let [num, den] = sub.split('/').map(Number);
let g = gcd(prevDen, den);
if (sign[i++] === '+') prevNum = prevNum * den / g + num * prevDen / g;
else prevNum = prevNum * den / g - num * prevDen / g;
prevDen = prevDen * den / g;
g = Math.abs(gcd(prevDen, prevNum));
prevNum /= g;
prevDen /= g;
}
return `${prevNum}/${prevDen}`;
};
function gcd(a, b) {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
}Ставь 👍 и забирай 📚 Базу знаний