给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 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,则分母需要变成1resDenominator = 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;}
};


上面的代码看着有些累赘,我们可以对初始分数值进行赋值为"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,则分母需要变成1resDenominator = 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. LeetCode 592. 分数加减运算(字符串+最大公约数)

    1. 题目 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母 ...

  2. 图解LeetCode——592. 分数加减运算(难度:中等)

    一.题目 给定一个表示分数加减运算的字符串 expression,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即:最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成 ...

  3. 【leetcode】592.分数加减运算(python)

    目录 一.题目描述 二.解题思路 2.1 查找 '/' 所在位置(第一思路) 2.2 利用python中分数表达Fraction函数 2.2.1 Fraction函数介绍 2.2.2 解题 2.3 类 ...

  4. LeetCode中等题之分数加减运算

    题目 给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数 ...

  5. LeetCode 0592. 分数加减运算:手把手分步のC++讲解

    [LetMeFly]592.分数加减运算:手把手分步のC++讲解 力扣题目链接:https://leetcode.cn/problems/fraction-addition-and-subtracti ...

  6. Leetcode 592. 分数加减运算 C++

    Leetcode 592. 分数加减运算 题目 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 ...

  7. JAVA程序设计:分数加减运算(LeetCode:592)

    给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1.所以 ...

  8. leetcode_592. 分数加减运算

    问题描述: 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母 ...

  9. 复数乘法、分数加减运算----2023/5/1

    复数乘法----2023/5/1 复数 可以用字符串表示,遵循 "实部+虚部i" 的形式,并满足下述条件: 实部 是一个整数,取值范围是 [-100, 100] 虚部 也是一个整数 ...

  10. 592.分数加减运算 纯纯的数学题,Python 7行代码+详细思路分享!

    592.分数加减运算 https://leetcode.cn/problems/fraction-addition-and-subtraction/solution/by-qingfengpython ...

最新文章

  1. Android之Handler有感(二)
  2. 渐进式遗传组卷算法(大规模题库,实际可用的算法) 智能组卷系统
  3. Linux问题分析或解决_ssh无法连接
  4. 吴恩达机器学习系列课程--个人笔记
  5. dotnet core 数据库
  6. 数据结构——堆栈的C语言实现
  7. ML《决策树(二)C4.5》
  8. NEL发布NEO Key-Value数据库LightDB
  9. 黑莓桌面管理器4.2_虚拟桌面管理器行业现状调研分析及发展趋势预测报告(2020)...
  10. 【MFC教程】MFC窗口创建
  11. 青花瓷(charles)的基本使用和注意事项
  12. 科学计算机弧度,科学计算器角度换算(学生计算器怎么算角度)
  13. 数据结构基础知识——非线性数据结构(二叉树、二叉排序树、优先队列、散列表)
  14. metersphere平台架构解析及二次开发
  15. 基于双语数据集搭建seq2seq模型
  16. 网速卡慢延迟大怎么解决?
  17. 如何使用python人脸识别_如何利用python进行精准人脸识别
  18. 一些学习gis有关的文章
  19. 红帽子linux硬盘安装教程,XP下硬盘安装RedHat Enterprise Linux 5.5图文教程
  20. 点是否在多边形内的射线判别法及其特殊处理C程序

热门文章

  1. 直通车测图需要满足哪些数据?
  2. 供应链三道防线(读书笔记)3(共4)
  3. tabbar角标 小程序_小程序tabbar实现底部tab导航栏
  4. Autojs.pro 7.0 - 免root 连点器
  5. 创建user01-user20 随机六位数密码 a-z A-Z 0-9
  6. Python随机生成6位数密码
  7. linux 共享文件拒绝访问权限,Samba共享文件夹拒绝访问
  8. 如何判断企业微信是否在线?
  9. 计算机一级添加通讯录好友,电脑企业微信从微信好友中添加成员功能如何使用...
  10. 停车场管理(C语言版)