算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 分数加减运算,我们先来看题面:
https://leetcode-cn.com/problems/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.
给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
这个结果应该是不可约分的分数,即最简分数。如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
示例
示例 1:
输入: expression = "-1/2+1/2"
输出: "0/1"
示例 2:
输入: expression = "-1/2+1/2+1/3"
输出: "1/3"
示例 3:
输入: expression = "1/3-1/2"
输出: "-1/6"
解题
因为是分数相加,为了便于编写和理解我抽象出了Number表示分数,并实现了分数相加的add方法(通分+分子相加)。
通分要利用到求最小公倍数,约分要用到求最大公因数。
之后就是字符串切割,切出每个带符号的分数,相加即可。
class Solution {
class Number {
//分子
public int numerator;
//分母
public int dinominator;
Number(int numerator, int dinominator){
this.numerator = numerator;
this.dinominator = dinominator;
}
public void add(Number number) {
int tmpD = getMinMultiple(this.dinominator, number.dinominator);
int tmpN = this.numerator * tmpD / this.dinominator + number.numerator * tmpD / number.dinominator;
this.numerator = tmpN;
this.dinominator = tmpD;
}
}
public String fractionAddition(String expression) {
List<Number> list = new LinkedList<>();
int pre = 0;
for(int i = 0; i < expression.length(); i++) {
if(i != 0 && (expression.charAt(i) == '+' || expression.charAt(i) == '-')) {
list.add(stringToNumber(expression.substring(pre, i)));
pre = i;
}
}
list.add(stringToNumber(expression.substring(pre, expression.length())));
Number number = new Number(0, 1);
for(Number n : list) {
number.add(n);
}
int gcd = gcd(number.numerator, number.dinominator);
number.numerator = number.numerator / gcd;
number.dinominator = number.dinominator / gcd;
if(number.dinominator < 0) {
number.numerator *= -1;
number.dinominator *= -1;
}
return number.numerator + "/" + number.dinominator;
}
//字符串转换为分数
public Number stringToNumber(String expression) {
String[] strs = expression.split("/");
return new Number(Integer.valueOf(strs[0]), Integer.valueOf(strs[1]));
}
//求最大公因数
public int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b , a % b);
}
}
//求最小公倍数
public int getMinMultiple(int a, int b) {
return a * b / gcd(a, b);
}
}
作者:suspectX
链接:https://leetcode-cn.com/problems/fraction-addition-and-subtraction/solution/java-by-suspectx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上期推文: