1. 程式人生 > 其它 >力扣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 }