【Leetcode】640. Solve the Equation

题目地址:

https://leetcode.com/problems/solve-the-equation/

给定一个字符串形式给出的一元一次方程,要求返回其解,如果有唯一解,则返回"x=#"的形式的字符串;若无穷个解则返回"Infinite solutions";若无解则返回"No solution"

先将方程按照=做split,然后解析左右两边的x的系数和常数项,最后分类讨论即可。解析的方式是用双指针。对于一个表达式,先将其前面加一个正号(如果以负号开头则不用加),然后维持慢指针永远都是指向正负号,快指针用来解析正负号后面的常数。具体代码如下:

public class Solution {
    public String solveEquation(String equation) {
        String[] split = equation.split("=");
        int[] left = coeff(split[0]), right = coeff(split[1]);
        int[] coeff = {left[0] - right[0], left[1] - right[1]};
        
        if (coeff[0] == 0) {
            return coeff[1] == 0 ? "Infinite solutions" : "No solution";
        } else {
            return "x=" + (-coeff[1] / coeff[0]);
        }
    }
    
    private int[] coeff(String s) {
    	// 如果s不以负号开头,则前面加上一个正号
        if (s.charAt(0) != '-') {
            s = "+" + s;
        }
        
        int[] res = new int[2];
        // coefX表示x的系数,coefC表示常数项
        int coefX = 0, coefC = 0;
        // l表示慢指针,r表示快指针
        int l = 0, r = 0;
        while (l < s.length()) {
        	// 取出正负号
            char ch = s.charAt(l);
            // r从l后面一位开始向后走
            r = l + 1;
            // 略过数字
            while (r < s.length() && Character.isDigit(s.charAt(r))) {
                r++;
            }
            
            int coef = 0;
            // 如果r停在了l后面一位,说明s[r] = 'x',将x的系数加上或者减去1
            if (r == l + 1) {
                coefX += ch == '+' ? 1 : -1;
            } else {
            	// 否则解析出数字
                int cof = Integer.parseInt(s.substring(l + 1, r));
                coef = ch == '+' ? cof : -cof;
                // 如果r走到了末尾或者r走到了正负号,则说明要更新常数项;否则要更新x的系数
                if (r == s.length() || s.charAt(r) != 'x') {
                    coefC += coef;
                } else {
                    coefX += coef;
                }
            }
            // 如果r走到末尾了就退出循环
            if (r == s.length()) {
                break;
            }
            
            // 否则将l移到下一个正负号上
            l = s.charAt(r) == 'x' ? r + 1 : r;
        }
        
        return new int[]{coefX, coefC};
    }
}

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值