JalanJiang/leetcode-notebook

640. 求解方程

JalanJiang opened this issue · 2 comments

啰里八嗦法

class Solution:
    def solveEquation(self, equation: str) -> str:
        formula = equation.split("=")
        x_count = 0
        num = 0
        
        # left
        pre_symbol = "+"
        number = 0
        has_number = False
        for c in formula[0]:
            if c != "+" and c != "-":
                if c == "x":
                    if not has_number:
                        add_x = 1
                    else:
                        if number == 0:
                            add_x = 0
                        else:
                            add_x = number
                    if pre_symbol == "+":
                        x_count += add_x
                    else:
                        x_count -= add_x
                    number = 0
                    has_number = False
                else:
                    number = number * 10 + int(c)
                    has_number = True
            else:
                # print(str(num) + pre_symbol + str(number))
                num = eval(str(num) + pre_symbol + str(number))
                number = 0
                has_number = False
                pre_symbol = c
        
        num = eval(str(num) + pre_symbol + str(number))
                
        # right
        pre_symbol = "-"
        number = 0
        has_number = False
        for c in formula[1]:
            if c != "+" and c != "-":
                if c == "x":
                    if not has_number:
                        add_x = 1
                    else:
                        if number == 0:
                            add_x = 0
                        else:
                            add_x = number
                    if pre_symbol == "+":
                        x_count += add_x
                    else:
                        x_count -= add_x
                    number = 0
                    has_number = False
                else:
                    has_number = True
                    number = number * 10 + int(c)
            else:
                num = eval(str(num) + pre_symbol + str(number))
                number = 0
                has_number = False
                if c == "+":
                    pre_symbol = "-"
                else:
                    pre_symbol = "+"
                    
        num = eval(str(num) + pre_symbol + str(number))
                
        # 计算结果
        if x_count == 0 and num == 0:
            return "Infinite solutions"
        if x_count == 0 and num != 0:
            return "No solution"
        return "x=" + str(-num // x_count)

优化:

  1. 函数封装
  2. 借助列表
class Solution:
    def solveEquation(self, equation: str) -> str:
        formula = equation.split("=")
        
        def get_count(formula):
            num_list = []
            pre_symbol = "+"
            x_count = 0
            num = 0
            for c in formula:
                # 不是运算符
                if c != "+" and c != "-":
                    if c == "x":
                        add_x = 1 if len(num_list) == 0 else int("".join(num_list))
                        if pre_symbol == "+":
                            x_count += add_x
                        else:
                            x_count -= add_x
                        num_list = [] # 清空列表
                    else:
                        # 是数字
                        num_list.append(c)
                # 是运算符
                else:
                    if len(num_list) != 0:
                        num = eval(str(num) + pre_symbol + "".join(num_list))
                    pre_symbol = c
                    num_list = []
            # 最后遗漏的数字
            if len(num_list) != 0:
                num = eval(str(num) + pre_symbol + "".join(num_list))
            return [x_count, num]
        
        left = get_count(formula[0])
        right = get_count(formula[1])

        x_count = left[0] - right[0]
        num = left[1] - right[1]
                
        # 计算结果
        if x_count == 0 and num == 0:
            return "Infinite solutions"
        if x_count == 0 and num != 0:
            return "No solution"
        return "x=" + str(-num // x_count)