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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/majinliang1234/article/details/82685945