Leetcode P640

Leetcode P640

作者;哇塞大嘴好帅

执行用时:1 ms, 在所有 Java 提交中击败了94.83%的用户

内存消耗:39.2 MB, 在所有 Java 提交中击败了97.85%的用户

ideas

​ 我们把方程"x+5-3+x=6+x-2"看成x=5-3-6-x+2=0,然后创建3个变量,一个用于记录x的系数,一个用于记录普通的数字,一个变量用户区别=的左侧和右侧,在创建一个变量用户用来记录当前处理到哪里了。

    int corr = 0,sum =0 ,sige = 1,index =0;

当sige为1的时候代表处理的是=号的左面,当sige为-1的时候代表处理的是等号的右边。

接下来遍历字符串equation,不过要处理几种特殊情况,一种是当我们遍历的时候遍历到=,一种是当我们遍历的时候遍历到x,一种是当我们遍历的时候遍历到单纯的+ -号。

        for (int i = 0; i < equation.length(); i++) {
            char c = equation.charAt(i);
            if (c == '='){
								.....
            } else if (c == 'x') {
                .....
            } else if (c == '+' || c == '-') {
                .....
            }
        }

当我们遍历到=的时候,要判断是否出现了一种特殊情况就是=的左面是数字,比如案列是"1+1=x",所以我们把1也算入进去

if (c == '='){
                //出现了x+5=... 的情况
                if (index < i){
                    sum += Integer.valueOf(equation.substring(index,i));
                }
                sige = -1;
                index = i + 1;
            } 

接下来如果是遍历到x的时候,如果是单纯的x或者是-x那么把他的系数看为1或者是-1,至于为什么±suge是因为如果在括号左面遇见就代表着如果是x就直接+1,如果是-x久直接-1,如果在括号右边遇见那么如果是x就-1,如果是-x就+1,还有一种正常的情况,就是3x,-3x这种情况,直接将她的系数*sige即刻

else if (c == 'x') {
                //如果遇见的只是一个单独的X 但是x可能是正的也可以能是负的
                if (index == i || equation.charAt(i-1) == '+'){
                    corr += sige;
                } else if (equation.charAt(i-1) == '-') {
                    corr -= sige;
                }
                //出现3x 4x情况
                else{
                    corr += Integer.valueOf(equation.substring(index,i)) * sige;
                }
                index = i + 1;
            } 

还有一种情况遍历到了+ -号的时候,就把出现的数字累加起来,关于为什么index ==i 是防止出现 +5-3这种情况 要读取的是-3而不是3.

else if (c == '+' || c == '-') {
                if (index < i){
                    sum += Integer.valueOf(equation.substring(index,i)) * sige;

                }
                //关于为什么index ==i 是放逐出现 +5-3这种情况 要读取的是-3而不是3
                index = i;
            }

当我们全部遍历完事后会出现一种特殊情况,这种特殊情况就是我们i已经遍历完了但是我们的index还没有到字符串的最后一位,比如案列

       /**
         * 会出现一种特殊情况比如6+x-2"
         * 当index到倒数第2个的时候 但是i会一直往后走 会结束for循环 所以要把最后一个数字耶计算进入
         */

所以我们要做一下特殊的处理

        if (index < equation.length()){
            sum += Integer.valueOf(equation.substring(index)) * sige;
        }

剩下就是这两种情况的求解,如果x的系数和普通数字的sum都为0那么直接返回IS,如果corr == 0 那么直接返回NS

        if (corr == 0 && sum == 0){
            return "Infinite solutions";
        }

        if (corr == 0){
            return "No solution";
        }

如果都不满足以上条件那么我们求出x的解

return  "x="+String.valueOf(-sum/corr);

至于这个sum为什么为-数是因为我们把公式变成了3x+3=0;我们要更改为3x=-3;这种。

code

class Solution {
    public String solveEquation(String equation) {
        int corr = 0,sum =0 ,sige = 1,index =0;

        for (int i = 0; i < equation.length(); i++) {
            char c = equation.charAt(i);
            if (c == '='){
                //出现了x+5=... 的情况
                if (index < i){
                    sum += Integer.valueOf(equation.substring(index,i));
                }
                sige = -1;
                index = i + 1;
            } else if (c == 'x') {
                //如果遇见的只是一个单独的X 但是x可能是正的也可以能是负的
                if (index == i || equation.charAt(i-1) == '+'){
                    corr += sige;
                } else if (equation.charAt(i-1) == '-') {
                    corr -= sige;
                }
                //出现3x 4x情况
                else{
                    corr += Integer.valueOf(equation.substring(index,i)) * sige;
                }
                index = i + 1;
            } else if (c == '+' || c == '-') {
                if (index < i){
                    sum += Integer.valueOf(equation.substring(index,i)) * sige;

                }
                //关于为什么index ==i 是放逐出现 +5-3这种情况 要读取的是-3而不是3
                index = i;
            }
        }
        //System.out.println(index+"and "+equation.length());

        /**
         * 会出现一种特殊情况比如6+x-2"
         * 当index到倒数第2个的时候 但是i会一直往后走 会结束for循环 所以要把最后一个数字耶计算进入
         */
        if (index < equation.length()){
            sum += Integer.valueOf(equation.substring(index)) * sige;
        }

        if (corr == 0 && sum == 0){
            return "Infinite solutions";
        }

        if (corr == 0){
            return "No solution";
        }

        return  "x="+String.valueOf(-sum/corr);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值