IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】【2022/7/27】592. 分数加减运算 -> 正文阅读

[数据结构与算法]【leetcode】【2022/7/27】592. 分数加减运算

问题描述:

  • 字符串中只包含分数和加减运算,返回字符串的计算结果。
    • 输入和输出分数格式均为 ±分子/分母
    • 第一个分数的正号会被省略。
    • 输入中只包含合法的最简分数。

解题思路:

  • 字符串解析求公式,一般都是直接做模拟。
    • 利用变量 num 来保存当前数值。
    • 利用变量 neg 来保存当前数的正负(注意分母均是正数)。
    • 把分数用分母和分子两个数值来表示。
  • 模拟思路如下:【可以用状态机的状态转移思想来理解整个模拟过程】
    1. 遇到 +- ,说明前一个分数的分母结束保存【把当前保存数值 num 存入分母中,并将 num 置为 0】,接着根据符号将 neg 置位;
      • 与此同时还需要将前两个分数相加。【两分数计算后求得分子和分母的 gcd 结果(即最大公约数),根据结果进行约分】
    2. 遇到 / ,说明当前分数的分子结束保存【把当前保存数值 num 存入分子中,并将 num 置为 0
    3. 遇到数值就更新 num 即可。
  • 本题稍微巧妙一点的方法在于如何处理边界。
    • 如在处理 -1/2 +1/2 的时候,可以认为是 0/1 -1/2 +1/2 的计算结果,如此便不用特别处理第一个分数。
    • 如处理 1/3 -1/2 的时候,可以认为是 +1/3 -1/2 ,即往前面补多一个正号,保证第一个分数的处理和后面的处理是一致的。【即使 -1/2 +1/2 也可以视为 + -1/2 +1/2】【同理可以在最后加上正号。逻辑上就是为了方便处理字符串中最后一个分母】

代码实现:

class Solution
{
private:
    // lu:left up,第一个分数的分子
    // ld:left down,第一个分数的分母
    // ru:right up,第二个分数的分子
    // rd:right down,第二个分数的分母
    int lu = 0, ld = 1, ru = 0, rd = 1;
    int gcd(int a, int b)
    {
        return b>0 ? gcd(b,a%b):a;
    }
    void count()
    {
        int u = lu * rd + ru * ld;
        int d = ld * rd;
        lu = u;
        ld = d;
        int tmp = gcd(abs(lu), ld);
        if(tmp == 0) return;
        lu /= tmp;
        ld /= tmp;
    }
public:
    string fractionAddition(string expression)
    {
        int m = expression.size();
        int neg = 1;
        int num = 0;
        for(int i = -1; i <= m; ++i)
        {
            char ch = i == -1 or i == m? '+' : expression[i];
            if(ch == '-' or ch == '+')
            {
                if(i != -1 and i != 0) rd = num;
                count();
                neg = ch == '-' ? -1 : 1;
                num = 0;
            }
            else if(ch == '/')
            {
                ru = num * neg;
                num = 0;
            }
            else if(ch >= '0' and ch <= '9')
                num = num * 10 + (int)(ch - '0');
        }
        string ans = lu < 0 ? "-" : "";
        ans += to_string(abs(lu)) + "/" + to_string(ld);
        return ans;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:07:37  更:2022-08-06 11:11:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:34:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码