力扣592、分數加減運算

給定一個表示分數加減運算表達式的字符串,你需要返回一個字符串形式的計算結果。 這個結果應該是不可約分的分數,即最簡分數。 如果最終結果是一個整數,例如 2,你需要將它轉換成分數形式,其分母爲 1。所以在上述例子中, 2 應該被轉換爲 2/1。
示例 1:
輸入:"-1/2+1/2"
輸出: "0/1"
示例 2:
輸入:"-1/2+1/2+1/3"
輸出: "1/3"
示例 3:
輸入:"1/3-1/2"
輸出: "-1/6"
示例 4:
輸入:"5/3+1/3"
輸出: "2/1"
說明:
輸入和輸出字符串只包含 '0''9' 的數字,以及 '/', '+''-'。 
輸入和輸出分數格式均爲 ±分子/分母。如果輸入的第一個分數或者輸出的分數是正數,則 '+' 會被省略掉。
輸入只包含合法的最簡分數,每個分數的分子與分母的範圍是  [1,10]。 如果分母是1,意味着這個分數實際上是一個整數。
輸入的分數個數範圍是 [1,10]。
最終結果的分子與分母保證是 32 位整數範圍內的有效整數。

這道題目拿到手的第一感覺就是用棧去存儲分數。(其實我想多啦)用啥都行,只要是將一個分數一個分數的分隔開就好啦。若是符號爲-我們就也將其保存,最後若保存的無-的爲正分數,反之則反。再加上對於1和10我們也需要稍加註意即可。
我們用數組來表示分數,數組的第一個元素是分子,第二個元素是分母
對於其運算我們就進行正常分數運算表達式進行運算
最後的最後一個分數運算完後,我們需要對其進行化簡,找到最大公約數,然後化簡即可。
思路應該很清晰明瞭,希望大家喜歡
最後代碼如下:

package medium;

import java.util.Stack;

public class fraction {
	 public String fractionAddition(String exp) {
		 //第一步,將字符串轉換爲分數"-1/2+1/2+1/3"
		 int[] fenshu={0,1};
		 Stack<String> stack=new Stack<String>();
		 for(int i=0;i<exp.length();i++){
			 char ch=exp.charAt(i);
			 if(ch=='/')
				 stack.push(exp.substring(i,i+1));
			 else if(ch>='2'&&ch<='9'){
				 stack.push(exp.substring(i,i+1));
			  }
			 else if(ch=='1'){
				 if(i<exp.length()-1&&exp.charAt(i+1)=='0')
				 { 
					 stack.push(exp.substring(i,i+2));
				     i++;
				 }
				 else
					 stack.push(exp.substring(i,i+1));
			 }else{
				 if(i==0){
					 stack.push(exp.substring(i,i+1));
				 }
				 else{
			     int[] temp=toFenshu(stack);
			     fenshu=cacul(temp,fenshu);
			     stack.removeAllElements();
			     if(ch=='-'){
			    	 stack.push(exp.substring(i,i+1));
				 }
			 }
				 }
		 }
		 int[] t=toFenshu(stack);
		 fenshu=cacul(t,fenshu);

		int k = findMaxyueshu(Math.abs(fenshu[0]), Math.abs(fenshu[1]));
		fenshu[0] = fenshu[0] / k;
		fenshu[1] = fenshu[1] / k;
			
		 String re=fenshu[0]+"/"+fenshu[1];
		 
		return re;
	    }
	 public int[] toFenshu(Stack<String> stack){
		 int[] temp=new int[2];
	     String strTemp1="";
	     for(String s:stack)
	    	 strTemp1=strTemp1+s;
	     
	     String[] strArr=strTemp1.split("/");
	     temp[0]=new Integer(strArr[0]);
	     temp[1]=new Integer(strArr[1]);
	     return temp;
	 }
	private int[] cacul(int[] temp, int[] fenshu) {
		int t1=temp[0],f1=fenshu[0];
		int t2=temp[1],f2=fenshu[1];
		if(f1==0)
			return temp;
		int[] re=new int[2];
		re[0]=t1*f2+t2*f1;
		re[1]=t2*f2;
		if(re[0]%re[1]==0){
			re[0]=re[0]/re[1];
			re[1]=1;
		}
		return re;
	}
	private int findMaxyueshu(int i, int j) {
		int min=Math.min(i, j);
		int max1=1;
		for(int k=1;k<=min;k++){
			if(i%k==0&&j%k==0)
				max1=Math.max(max1, k);
		}
		return max1;
	}
	public static void main(String[] args) {
		String s="-1/2+1/2+1/3";
		fraction f=new fraction();
		System.out.println(f.fractionAddition(s));
		System.out.println(f.findMaxyueshu(12, 3));

	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章