• 640.Solve the Equation


    The Description of the Problem

    Solve a given equation and return the value of x in the form of a string x=#value. The equation contains only +,- operation, the variable x and its coefficient. You should return No solution if there is no solution for the equation, or Infinite solutions if there are infinite solutions for the equation.
    If there is exactly one solution for the equation, we ensure that the value of x is an integer.

    The intuition for this

    1. The main idea is megering parts in same ending.
    2. transfer all the elements from right to the left
    3. add all the coefficients and constants
    4. compare the value of summarization of coefficients and constants.

    The code 1

    #include 
    #include 
    #include 
    class Solution {
    public:
        std::string solveEquation(std::string equation) {
            int results[2] = {0, 0}; // first element is the summation of coefficients, second element is the summation of constants
            int sign = 1;
            int i = 0;
            int n = equation.size();
            while (i < n) {
                if (equation[i] == '=') {
                    sign = -1;
                    i++;
                    continue;
                }
                int sign_part = sign;
                if (equation[i] == '+' || equation[i] == '-') {
                    sign_part = (equation[i] == '+' ? 1 : -1) * sign;
                    i++;
                }
                int val = 0;
                bool is_valid = false;
                while (i < n && isdigit(equation[i])) {
                    val = val * 10 + equation[i] - '0';
                    i++;
                    is_valid = true;
                }
                if (i < n && equation[i] == 'x') {
                    results[0] += is_valid ? sign_part * val : sign_part;
                    i++;
                } else {
                    results[1] += sign_part * val;
                }
            }
            if (results[0] == 0) {
                return results[1] == 0 ? "Infinite solutions" : "No solution";
            } else {
                return "x=" + std::to_string(-results[1]/results[0]);
            }
        }
    };
    int main()
    {
        Solution s;
        std::cout << "The resuts of x+5-3+x=6 is as follows:" << std::endl;
        std::cout << s.solveEquation("x+5-3+x=6+x-2") << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    The results

    在这里插入图片描述

    The code 2 (mainly use substr())

    class Solution {
    public:
        string solveEquation(string equation) {
            string s = equation;
            // split s into two parts by '='
            int pos = s.find('=');
            string sLeft = s.substr(0, pos);
            string sRight = s.substr(pos + 1);
            // analyze each part into coefficents and constants by '+' and '-'
            vector<int> coefficients;
            vector<int> constants;
            analyzeString(sLeft, coefficients, constants, 1);
            analyzeString(sRight, coefficients, constants, -1);
            // add all the coefficents and constants
            int sum_coeff = 0, sum_const = 0;
            for (int i = 0; i < coefficients.size(); i++) {
                sum_coeff += coefficients[i];
            }
            for (int i = 0; i < constants.size(); i++) {
                sum_const += constants[i];
            }
            // return the result
            string result = "";
            if (!sum_coeff) {
                result = sum_const ? "No solution" : "Infinite solutions";
            } else {
                result = "x=" + to_string(-sum_const / sum_coeff);
            }
            return result;
        }
        void analyzeString(string s, vector<int>& coefficients, vector<int>& constants, int sign) {
            int sign_ = sign;
            if (s[0] == '+' || s[0] == '-') {
                s = s.substr(1);
                sign_  = sign * (s[0] == '+' ? 1 : -1);
            }
            int index = 0;
            while (index < s.size()) {
                string num = "";
                int sign_next = sign;
                if (s[index] == '+' || s[index] == '-') {
                    sign_next = s[index] == '+' ? 1 : -1;
                    num = s.substr(0, index);
                    if (!num.empty()) {
                        if (num.find('x') != string::npos) {
                            if (num[0] == 'x') {
                                coefficients.push_back(sign_);
                            } else {
                                coefficients.push_back(sign_ * stoi(num));
                            }
                        } else {
                            constants.push_back(sign_ * stoi(num));
                        }
                    }
                    s = s.substr(index + 1);
                    index = 0;
                    sign_ = sign * sign_next;
                } else {
                    index++;
                }
            }
            if (!s.empty()) {
                if (s.find('x') != string::npos) {
                    if (s[0] == 'x') {
                        coefficients.push_back(sign_);
                    } else {
                        coefficients.push_back(sign_ * stoi(s));
                    }
                } else {
                    constants.push_back(sign_ * stoi(s));
                }
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    在这里插入图片描述

  • 相关阅读:
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.10 jetcache 本地缓存方案
    C++----类型转换
    盲人旅行新纪元:科技之眼助力无障碍探索之旅
    python多线程
    分享一个你很可能不知道的Java异常实现的缺陷
    rust &String 和 &str 区别
    【初学Python】Python从入门到精通:一个月就够了~(定制详细的计划)
    GitHub Actions 安全最佳实践
    Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
  • 原文地址:https://blog.csdn.net/weixin_38396940/article/details/126311662