LeetCode刷题实战592分数加减运算
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从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 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上期推文:
LeetCode1-580题汇总,希望对你有点帮助!
LeetCode刷题实战581:最短无序连续子数组
LeetCode刷题实战582:杀掉进程
LeetCode刷题实战583:两个字符串的删除操作
LeetCode刷题实战584:寻找用户推荐人
LeetCode刷题实战585:2016年的投资
LeetCode刷题实战586:订单最多的客户
LeetCode刷题实战587:安装栅栏
LeetCode刷题实战588:设计内存文件系统
LeetCode刷题实战589:N 叉树的前序遍历
LeetCode刷题实战590:N 叉树的后序遍历
LeetCode刷题实战591:标签验证器
手机用满5年已是极限,当出现这4类情况,别犹豫该更新换代了一台手机的寿命是多久?其实很少人给出确切的答案,但我相信大家都希望自己买的大旗舰能顶用个三五年。各价位手机性能的区别也决定了它的寿命长度,如果出现以下四种现象任意一种,那么你该换手
小屏旗舰依然可以期待,iPhonese3外观可能有惊喜说到小屏旗舰,目前市面上能够有所建树的还是iPhone12mini,虽然这样的产品依旧受到续航的干扰,但其销量还是有目共睹的。但即便如此,较高的价格依然将很多潜在的小屏旗舰爱好者拒
FaceBook改名元宇宙深层原因2021年3月Roblox的上市让Metaverse元宇宙概念引爆市场,接近400亿美元的市值彻底打开了元宇宙行业的想象空间。Metaverse中,用户不再可以区分物理性的真是存在
一加与小米手机使用感受mi10用了快两年了,运行速度还可以,就是电池不耐用了,趁着春节京东搞活动就想着换一个算了。可能是小米新型号上市,为了清库存吧,这次小米的旧机型活动力度很大,mi10s2299,m
远古比喜马拉雅还要庞大的超级山脉曾经,数十亿年前,高度媲美喜马拉雅的山脉绵延数千公里,横跨合并超级大陆的接缝。就像衰老的牙齿一样,这些巨人现在已被时间和腐烂磨损到根部。但在那些风化的遗迹中,可能是关于这些古老超级
远程协作好帮手,音质更清晰,戴尔Pro立体声耳机上手这几年随着远程办公成为日常,定时参加在线会议也成了很多人的必修课,在线上参会的时候,耳机麦克风的质量和网络的稳定性都很重要,起初很多朋友会用普通的蓝牙耳机或者外放,这样不仅音质很差
颜值超高!倍思100W充电套装限时138元秒杀近期笔者发现一款颜值超高的充电套装,配色也是绝美的。这个充电套装就是倍思100W充电套装,现在还在做活动,限时138元秒杀,感兴趣的可以了解一下。读者朋友们看这颜值是不是很高,买回
你认为中国人为什么如此迷恋手机?我们的生活和手机密不可分,离不开手机现在的手机,对很多正常人来讲,是不能缺少的,功能强大的随身工具,如此迷恋,是现代生活与手机息息相关。下面就根据我个人见解,在三个方面大概粗谈一下
价格几乎一样,小米12对比IQOO9,你更好看哪一款?在国产手机中,如果你要入手一款中端偏上的产品,那么小米数字系列和IQOO系列绝对是绕不开的机型,它们一般都处在30004000的价位之间,而产品力表现却能够摸到顶级旗舰的尾巴,既有
手机关机和重启有什么区别?维修手机老师傅告诉你学长身边很多朋友平常都是不会重启手机的,甚至不会关机,那么很多人就非常好奇手机到底是关机好,还是不关机好?学长特地去采访了一下数码店里维修手机的老师傅,得到大多数的回答就是不关机好
火电厂还有未来吗?火电厂在很长一段时间内还会处于主力地位。虽然以风光为代表的新能源发展迅速,局部地区甚至装机容量和发电量超过了火力发电。但新能源的随机性,波动性,大规模电力电子化,电网友好性差等问题