LeetCode: 592. Fraction Addition and Subtraction

题目:592. Fraction Addition and Subtraction(https://leetcode.com/problems/fraction-addition-and-subtraction/description/)

解法:首先对字符串进行拆分,组成一个个分数,然后分数通分相加,最后约分。

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
	
    public String fractionAddition(String expression) {
        List<Fractional> fList = buildFractionalList(expression);
        Fractional added = add(fList);
        Fractional result = reduction(added);
        return result.toString();
    }
    
    public List<Fractional> buildFractionalList(String expression){
    	List<Fractional> list = new ArrayList<>();
        Pattern pattern = Pattern.compile("([\\+\\-])?\\d+/\\d+");
        Matcher matcher = pattern.matcher(expression);
        while (matcher.find()) {
            boolean plus = true;
            String current = matcher.group();
            if (current.contains("-")) {
                plus = false;
                current = current.replace("-", "");
            } else {
                current = current.replace("+", "");
            }
            String[] elems = current.split("/");
            if (plus) {
                list.add(new Fractional(Integer.parseInt(elems[0]),
                        Integer.parseInt(elems[1])));
            } else {
                list.add(new Fractional(Integer.parseInt(elems[0]) * -1,
                        Integer.parseInt(elems[1])));
            }
        }
        return list;
    }

    public Fractional add(List<Fractional> list) {
        Optional<Fractional> result = list
        		.stream()
        		.reduce((f1, f2) -> {
		            Fractional f = new Fractional();
		            f.numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator;
		            f.denominator = f1.denominator * f2.denominator;
		            return f;
		        });

        return result.get();
    }

    public Fractional reduction(Fractional f) {
        if (f.numerator == 0) {
            return new Fractional(0, 1);
        }
        boolean negative = false;
        if (f.numerator < 0) {
            negative = true;
            f.numerator = 0 - f.numerator;
        }
        int m = f.denominator;
        int n = f.numerator;
        int k = m % n;
        while (k != 0) {
            m = n;
            n = k;
            k = m % n;
        }
        f.denominator = f.denominator / n;
        f.numerator = negative ? 0 - f.numerator / n : f.numerator / n;
        return f;
    }
    
    public static class Fractional {
        public int numerator;
        public int denominator;
        public Fractional(int numerator, int denominator) {
            this.numerator = numerator;
            this.denominator = denominator;
        }
        public Fractional() {
        }
        public String toString() {
        	return "" + numerator + "/" + denominator;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值