ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

力扣592(java)-分数加减运算(中等)

2022-05-28 14:31:24  阅读:193  来源: 互联网

标签:pre 分数 592 java int 力扣 expression nums1 nums2


题目:

给定一个表示分数加减运算的字符串 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有