编程语言
首页 > 编程语言> > 力扣592(java)-分数加减运算(中等)

力扣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 }

标签:pre,分数,592,java,int,力扣,expression,nums1,nums2
来源: https://www.cnblogs.com/lmy569/p/16320616.html