​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<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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上期推文:

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:标签验证器

58c1e59f6a38056fd45e0f204023a962.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值