• 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;
    
    • 1

    当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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    接下来如果是遍历到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;
                } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    还有一种情况遍历到了+ -号的时候,就把出现的数字累加起来,关于为什么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;
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

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

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

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

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

            if (corr == 0 && sum == 0){
                return "Infinite solutions";
            }
    
            if (corr == 0){
                return "No solution";
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

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

    至于这个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);
        }
    }
    
    • 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
  • 相关阅读:
    电竞游戏行业有哪些媒体资源?活动发布会如何宣传?
    1.77亿美元,安世被迫出售晶圆大厂NWF | 百能云芯
    Apache Doris 系列: 基础篇-Routine Load
    Linux学习——文件IO
    dolphinscheduler docker compose安装配置
    SSL error when connecting to the Jack server. Try ‘jack-diagnose‘
    【C++】:内存管理:C++内存分布 || C++中动态内存管理(new || delete)
    LinEnum提权辅助脚本使用指南
    这可能是最全的 SpringBoot3 新版本变化了
    手写一个线程池
  • 原文地址:https://blog.csdn.net/qq_40102411/article/details/126294923