LeetCode 分数加减运算

给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 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 位整数范围内的有效整数。

思路分析: 这道题思路很简单,每次读取一个分数,并与之前的已经计算的中间结果进行计算,计算完后进行约分化简,继续下一次计算。

class Solution {
public:
	string fractionAddition(string expression) {
		int index = 0, expressionSize = expression.size();
		long resNumerator, resDenominator;//结果的分子、分母
		//获取第一个分数
		if (expression[0] == '-') {
			index += 1;
		}
		//获取分子
		resNumerator = expression[index++] - '0';
		if (expression[index] != '/') {//可能分子含有两位数
			resNumerator = resNumerator * 10 + expression[index++] - '0';
		}
		index += 1;//跳过分数线
		//获取分母
		resDenominator = expression[index++] - '0';
		if (index < expressionSize && expression[index] >= '0' && expression[index] <= '9') {//可能分母含有两位数
			resDenominator = resDenominator * 10 + expression[index++] - '0';
		}
		if (expression[0] == '-') {//第一个符号是负号,注意只需要添加到分子即可,不能添加到分母
			resNumerator = -resNumerator;
		}
		while (index < expressionSize) {
			char operatorCh = expression[index++];//操作符
			//获取下一个分子
			int tempNumerator = expression[index++] - '0';
			if (expression[index] != '/') {//可能分子含有两位数
				tempNumerator = tempNumerator * 10 + expression[index++] - '0';
			}
			index += 1;//跳过分数线
			//获取下一个分母
			int tempDenominator = expression[index++] - '0';
			if (index < expressionSize && expression[index] >= '0' && expression[index] <= '9') {//可能分母含有两位数
				tempDenominator = tempDenominator * 10 + expression[index++] - '0';
			}
			if (operatorCh == '-') {//符号是负号,注意只需要添加到分子即可,不能添加到分母
				tempNumerator = -tempNumerator;
			}
			//计算
			resNumerator = resNumerator * tempDenominator + resDenominator * tempNumerator;
			resDenominator *= tempDenominator;
			if (resNumerator == 0) {//如果分子为0,则分母需要变成1
				resDenominator = 1;
			}
			else {
				int factor = maxCommonFactor(resNumerator, resDenominator);//寻找最大公因数
				resNumerator /= factor;//化简约分
				resDenominator /= factor;
			}
		}
		return to_string(resNumerator) + "/" + to_string(resDenominator);
	}
	//辗转向除法
	int maxCommonFactor(long numOne, long numTwo) {
		if (numOne < 0) {
			return maxCommonFactor(-numOne, numTwo);
		}
		if (numOne < numTwo) {
			return maxCommonFactor(numTwo, numOne);
		}
		long tempRes;
		while (numOne % numTwo != 0) {
			tempRes = numOne % numTwo;
			numOne = numTwo;
			numTwo = tempRes;
		}
		return numTwo;
	}
};

LeetCode 分数加减运算_第1张图片
上面的代码看着有些累赘,我们可以对初始分数值进行赋值为"0/1",然后直接循环读取分数进行计算,去掉读取第一个分数初始化的操作。

class Solution {
public:
	string fractionAddition(string expression) {
		char operatorCh = '+';//操作符
		int index = 0, expressionSize = expression.size();
		long resNumerator = 0, resDenominator = 1;//结果的分子、分母(初始化分式的值为零)
		while (index < expressionSize) {
			if (expression[index] == '+' || expression[index] == '-') {
				operatorCh = expression[index++];//操作符
			}
			//获取下一个分子
			int tempNumerator = expression[index++] - '0';
			if (expression[index] != '/') {//可能分子含有两位数
				tempNumerator = tempNumerator * 10 + expression[index++] - '0';
			}
			index += 1;//跳过分数线
			//获取下一个分母
			int tempDenominator = expression[index++] - '0';
			if (index < expressionSize && expression[index] >= '0' && expression[index] <= '9') {//可能分母含有两位数
				tempDenominator = tempDenominator * 10 + expression[index++] - '0';
			}
			if (operatorCh == '-') {//符号是负号,注意只需要添加到分子即可,不能添加到分母
				tempNumerator = -tempNumerator;
			}
			//计算
			resNumerator = resNumerator * tempDenominator + resDenominator * tempNumerator;
			resDenominator *= tempDenominator;
			if (resNumerator == 0) {//如果分子为0,则分母需要变成1
				resDenominator = 1;
			}
			else {
				int factor = maxCommonFactor(resNumerator, resDenominator);//寻找最大公因数
				resNumerator /= factor;//化简约分
				resDenominator /= factor;
			}
		}
		return to_string(resNumerator) + "/" + to_string(resDenominator);
	}
	//辗转向除法
	int maxCommonFactor(long numOne, long numTwo) {
		if (numOne < 0) {
			return maxCommonFactor(-numOne, numTwo);
		}
		if (numOne < numTwo) {
			return maxCommonFactor(numTwo, numOne);
		}
		long tempRes;
		while (numOne % numTwo != 0) {
			tempRes = numOne % numTwo;
			numOne = numTwo;
			numTwo = tempRes;
		}
		return numTwo;
	}
};

你可能感兴趣的:(LeetCode,字符串)