給定一個表示分數加減運算表達式的字符串,你需要返回一個字符串形式的計算結果。 這個結果應該是不可約分的分數,即最簡分數。 如果最終結果是一個整數,例如 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));
}
}