-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path592-FractionAdditionAndSubtraction.go
More file actions
90 lines (81 loc) · 3.09 KB
/
592-FractionAdditionAndSubtraction.go
File metadata and controls
90 lines (81 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
// 592. Fraction Addition and Subtraction
// Given a string expression representing an expression of fraction addition and subtraction,
// return the calculation result in string format.
// The final result should be an irreducible fraction.
// If your final result is an integer, change it to the format of a fraction that has a denominator 1.
// So in this case, 2 should be converted to 2/1.
// Example 1:
// Input: expression = "-1/2+1/2"
// Output: "0/1"
// Example 2:
// Input: expression = "-1/2+1/2+1/3"
// Output: "1/3"
// Example 3:
// Input: expression = "1/3-1/2"
// Output: "-1/6"
// Constraints
// The input string only contains '0' to '9', '/', '+' and '-'. So does the output.
// Each fraction (input and output) has the format ±numerator/denominator. If the first input fraction or the output is positive, then '+' will be omitted.
// The input only contains valid irreducible fractions, where the numerator and denominator of each fraction will always be in the range [1, 10]. If the denominator is 1, it means this fraction is actually an integer in a fraction format defined above.
// The number of given fractions will be in the range [1, 10].
// The numerator and denominator of the final result are guaranteed to be valid and in the range of 32-bit int.
import "fmt"
import "strconv"
// stack
func fractionAddition(expression string) string {
convertToInt := func (st []rune) int {
n, _ := strconv.Atoi(string(st))
return n
}
abs := func(x int) int { if x < 0 { return -x; }; return x; }
gcd := func (x, y int) int { for y != 0 { x, y = y, x % y; }; return x; }
calc := func (nums []int) []int {
a, b, c, d := nums[0], nums[1], nums[2], nums[3]
n, d := a * d + c * b, b * d
if n % d == 0 {
return []int{n/d, 1}
}
m := abs(gcd(n, d))
return []int{n/m, d/m}
}
nums, stack := make([]int, 0, 4), make([]rune, 0, len(expression))
for i, ch := range expression {
switch {
case ch == '-' || ch == '+':
if len(stack) > 0 {
num := convertToInt(stack)
nums = append(nums, num)
stack = stack[len(stack):]
}
stack = append(stack, ch)
case ch == '/':
num := convertToInt(stack)
nums = append(nums, num)
stack = stack[len(stack):]
default:
stack = append(stack, ch)
}
if i == len(expression) - 1 {
nums = append(nums, convertToInt(stack))
}
if len(nums) == 4 {
nums = calc(nums)
}
}
return strconv.Itoa(nums[0]) + "/" + strconv.Itoa(nums[1])
}
func main() {
// Example 1:
// Input: expression = "-1/2+1/2"
// Output: "0/1"
fmt.Println(fractionAddition("-1/2+1/2")) // "0/1"
// Example 2:
// Input: expression = "-1/2+1/2+1/3"
// Output: "1/3"
fmt.Println(fractionAddition("-1/2+1/2+1/3")) // 1/3
// Example 3:
// Input: expression = "1/3-1/2"
// Output: "-1/6"
fmt.Println(fractionAddition("1/3-1/2")) // "-1/6"
}