Skip to content

Commit 3f11d18

Browse files
committed
https://leetcode.cn/problems/fraction-addition-and-subtraction/
1 parent 3b8f8a5 commit 3f11d18

File tree

7 files changed

+74
-2
lines changed

7 files changed

+74
-2
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,8 @@ https://leetcode.cn/problems/sequence-reconstruction/
904904

905905
https://leetcode.cn/problems/ur2n8P/
906906

907+
https://leetcode.cn/problems/fraction-addition-and-subtraction/
908+
907909
#### 安装教程
908910

909911
1. 安装`deno`
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
export class Fraction {
2+
sign: number;
3+
molecular: number;
4+
denominator: number;
5+
toString() {
6+
return `${
7+
this.sign < 0 ? "-" : ""
8+
}${this.molecular}/${this.denominator}`;
9+
}
10+
constructor({
11+
sign = "+",
12+
molecular = 1,
13+
denominator = 1,
14+
}: {
15+
sign?: "+" | "-" | number;
16+
molecular?: number | string;
17+
denominator?: number | string;
18+
} = {}) {
19+
sign = sign || "+";
20+
this.sign = (sign === "+" ? 1 : sign === "-" ? -1 : sign) *
21+
Math.sign(Number(denominator)) *
22+
Math.sign(Number(molecular));
23+
this.molecular = Math.abs(Number(molecular));
24+
this.denominator = Math.abs(Number(denominator));
25+
}
26+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function deduplication<T>(iter: Iterable<T>): Array<T> {
2+
return Array.from(new Set(iter));
3+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { greatest_common_divisor } from "../max-points-on-a-line/greatest_common_divisor.ts";
2+
import { deduplication } from "./deduplication.ts";
3+
import { Fraction } from "./Fraction.ts";
4+
import { parseFraction } from "./parseFraction.ts";
5+
function fractionAddition(expression: string): string {
6+
const fractions = parseFraction(expression);
7+
8+
const denominator = deduplication(
9+
fractions.map((f) => f.denominator),
10+
).reduce((a, b) => a * b);
11+
const molecular = fractions
12+
.map((f) => (f.sign * f.molecular * denominator) / f.denominator)
13+
.reduce((a, b) => a + b);
14+
const gcd = greatest_common_divisor(molecular, denominator);
15+
16+
return new Fraction({
17+
denominator: denominator / gcd,
18+
molecular: molecular / gcd,
19+
}).toString();
20+
}
21+
export default fractionAddition;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Fraction } from "./Fraction.ts";
2+
3+
export function parseFraction(expression: string): Array<Fraction> {
4+
return Array.from(
5+
expression.matchAll(
6+
/(?<sign>[+-]?)(?<molecular>\d+)\/(?<denominator>\d+)/g,
7+
),
8+
).map((a) => new Fraction(a.groups));
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";
2+
import fractionAddition from "./index.ts";
3+
Deno.test("fraction-addition-and-subtraction", () => {
4+
assertEquals(
5+
"77464/145635",
6+
fractionAddition("100/399-133/2555-1/2+1/2-1/2+1/2+1/3"),
7+
);
8+
assertEquals("0/1", fractionAddition("-1/2+1/2"));
9+
assertEquals("1/3", fractionAddition("-1/2+1/2+1/3"));
10+
assertEquals("-1/6", fractionAddition("1/3-1/2"));
11+
});
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export const greatest_common_divisor = (a: number, b: number): number => {
1+
export function greatest_common_divisor(a: number, b: number): number {
22
return b != 0 ? greatest_common_divisor(b, a % b) : a;
3-
};
3+
}

0 commit comments

Comments
 (0)