力扣592(java)-分数加减运算(中等)
题目:
给定一个表示分数加减运算的字符串 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"
提示:
输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。
输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。
输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
输入的分数个数范围是 [1,10]。
最终结果的分子与分母保证是 32 位整数范围内的有效整数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fraction-addition-and-subtraction
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
模拟计算过程:
先对两个分数通分,计算出他们的运算结果后,再进行分数化简,再与下一个分数进行通分运算,再进行分数化简...如此重复,直到算出最后的结果。
代码:
1 class Solution { 2 public String fractionAddition(String expression) { 3 List<Character> sign = new ArrayList<>(); 4 //第一个如果是正数就需要先加入"+" 5 if(expression.charAt(0) != '-'){ 6 sign.add('+'); 7 } 8 //遍历数组,将加减号放在字符数组中 9 for(int i = 0; i < expression.length(); i++){ 10 if(expression.charAt(i) == '+' || expression.charAt(i) == '-') 11 sign.add(expression.charAt(i)); 12 } 13 //给分子分母设定初始值:0/1 14 int i = 0,pre_nums1 = 0, pre_nums2 = 1; 15 for(String s: expression.split("(\\+)|(-)")){ 16 if(s.length() > 0){ 17 //以除号作为分割符分割成两个数 18 String[] fraction = s.split("/"); 19 int nums1 = (Integer.parseInt(fraction[0])); 20 int nums2 = (Integer.parseInt(fraction[1])); 21 //求两个分母的最大公约数 22 int g = Math.abs(gcd(nums2, pre_nums2)); 23 if(sign.get(i++) == '+') 24 pre_nums1 = pre_nums1*nums2/g + nums1*pre_nums2/g; 25 else 26 pre_nums1 = pre_nums1*nums2/g - nums1*pre_nums2/g; 27 pre_nums2= nums2*pre_nums2/g; 28 //更新最大公约数 29 g = Math.abs(gcd(pre_nums2, pre_nums1)); 30 //化简分子分母 31 pre_nums1 /= g; 32 pre_nums2 /= g; 33 } 34 } 35 return pre_nums1 + "/" + pre_nums2; 36 } 37 public int gcd(int a, int b){ 38 while(b != 0) { 39 int t = b; 40 b = a % b; 41 a = t; 42 } 43 return a; 44 } 45 }