LeetCode算法日记:640. 求解方程

640. 求解方程

日期:2022/8/10

题目描述:求解一个给定的方程,将x以字符串 “x=#value” 的形式返回。该方程仅包含 ‘+’ , ‘-’ 操作,变量 x 和其对应系数。

如果方程没有解,请返回 “No solution” 。如果方程有无限解,则返回 “Infinite solutions” 。

题目保证,如果方程中只有一个解,则 ‘x’ 的值是一个整数。

示例:

输入: equation = "x+5-3+x=6+x-2"
输出: "x=2"

输入: equation = "x=x"
输出: "Infinite solutions"

输入: equation = "2x=x"
输出: "x=0"

思路:

移项,定义k=0,b=0,kx=b(最后return b/k)
遍历equation,有下面四种情况
1.遇到=,从等式左边变到等式右边。用right来记录。等式两边的符号运算时是相反的
2.遇到数字,这时候有两种可能:后面带x、后面不带x。先while循环记录这个数字,再根据后面有没有x,来改变k或者b
3.遇到x,此时x的系数是1或-1
4.遇到符号,用symbol来记录当前符号,以便在后续的步骤2或3中计算

最后输出:k=0时肯定是无效的,但是b=0的话就是"Infinite solution",b!=0的话是"No solution"
k!=0时输出"x=" + to_string(b/k);

代码+解析:

class Solution {
public:
    string solveEquation(string equation) {
        int k=0,b=0; //kx=b;    return b/k
        bool right = false ; //是否碰到=,初始是没碰到
        int symbol=1;  //1代表+,2代表-
        for(int i=0; i<equation.size(); i++){
            if(equation[i] == '='){
                symbol = 1;  //默认为+
                right = true;
            }
            else if(equation[i] >='0' && equation[i] <='9'){
                //数字,可能是系数也可能是b
                int temp = 0;
                while(i<equation.size() && equation[i] >= '0' && equation[i] <= '9'){
                    temp = temp*10 + equation[i] - '0';
                    i++;
                }

                if(equation[i] == 'x'){  //是系数
                    if((!right && symbol == 1) || (right && symbol == 2)) k += temp;
                    else k -= temp;
                }else{   //不是系数
                    if((!right && symbol == 2) || (right && symbol == 1)) b += temp;
                    else b -= temp;
                    i--;
                }
            }else if(equation[i] == 'x'){
                //系数为1或-1的x
                if((!right && symbol == 1) || (right && symbol == 2)) k += 1;
                else k -= 1;
            }else{
                //符号
                if(equation[i] == '+') symbol = 1;
                else symbol = 2;
            }
        }
        if(k == 0) return b == 0 ? "Infinite solutions" : "No solution";
        else return "x=" + to_string(b/k);
    }
    
    
};

学到的总结:

  1. 思路不难,但是分类讨论时要很细节,要想到很多
  2. 第一次有些细节没想到,后来重新又从头开始写才把测试用例可以通过。结果提交时有一半没通过,急死了,检查了才发现是equation[i]转换为int时没有加-‘0’,还好不是什么细节没有注意到,可喜可贺!

执行结果:

通过

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6 MB, 在所有 C++ 提交中击败了31.17%的用户

通过测试用例:59 / 59

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值