Giả sử chúng ta có một chuỗi đại diện cho một biểu thức toán học với (+, -, *, /) Ở đây / là đại diện cho phép chia số nguyên, chúng ta phải đánh giá và trả về kết quả mà không cần sử dụng bất kỳ hàm tích hợp nào.
Vì vậy, nếu đầu vào là s ="2 + 3 * 5/7", thì đầu ra sẽ là 4, là 2 + ((3 * 5) / 7) =4
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- s:=đảo ngược chuỗi đã cho
- Xác định một hàm get_value ().
- dấu hiệu:=1
- nếu s không trống và phần tử cuối cùng của s giống như "-", thì
- xóa phần tử cuối cùng khỏi s
- dấu:=-1
- giá trị:=0
- while s không trống và phần tử cuối cùng của s là một chữ số, hãy thực hiện
- giá trị:=value * 10
- value:=value + giá trị số của phần tử cuối cùng từ s và xóa phần tử cuối cùng của s
giá trị - dấu trả lại *
- Xác định một hàm get_term ()
- hạn:=get_value ()
- while s không trống và phần tử cuối cùng của s là * hoặc /, do
- op:=phần tử cuối cùng của s và xóa phần tử cuối cùng khỏi s
- giá trị:=get_value ()
- nếu op giống như "*", thì
- hạn:=hạn * giá trị
- nếu không,
- hạn:=sàn của (1,0 * điều khoản / giá trị)
- thời hạn trả lại
- Từ phương thức chính, hãy làm như sau:
- ans:=get_term ()
- while s không trống, thực hiện
- op:=phần tử cuối cùng của s và xóa nó khỏi s
- hạn:=get_term ()
- nếu op giống như "+", thì
- ans:=ans + term
- nếu không,
- ans:=ans - term
- trả lại ans
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
from math import floor, trunc class Solution: def solve(self, s): s = list(s[::-1]) def get_value(): sign = 1 if s and s[-1] == "-": s.pop() sign = -1 value = 0 while s and s[-1].isdigit(): value *= 10 value += int(s.pop()) return sign * value def get_term(): term = get_value() while s and s[-1] in "*/": op = s.pop() value = get_value() if op == "*": term *= value else: term = floor(1.0 * term / value) return term ans = get_term() while s: op, term = s.pop(), get_term() if op == "+": ans += term else: ans -= term return ans ob = Solution() s = "2+3*5/7" print(ob.solve(s))
Đầu vào
"2+3*5/7"
Đầu ra
4