Вопрос:
Дано математическое уравнение, содержащее только числа и +, -, *, /. Выведите уравнение в обратном порядке, чтобы уравнение стало обратным, но числа остались прежними.
Гарантируется, что заданное уравнение верно, и в нем нет ведущих нулей.
Пример 1:
Input: S = "20-3+5*2" Output: 2*5+3-20 Explanation: The equation is reversed with numbers remaining the same.
Пример 2:
Input: S = "5+2*56-2/4" Output: 4/2-56*2+5 Explanation: The equation is reversed with numbers remaining the same.
Ваша задача
Вам не нужно ничего читать или печатать. Ваша задача — завершить функцию reverseEqn(), которая принимает в качестве входных данных строку S, представляющую уравнение, и возвращает результирующую строку, представляющую уравнение в обратном порядке.
Ожидаемая временная сложность:O(|S|).
Ожидаемое вспомогательное пространство:O(|S|).
Ограничения:
1‹=|S|‹=105
Строка содержит только символы '0' — '9', '+', '-', '* ', и '/'.
Решение:
Подход:
Здесь нам нужно обратить данное уравнение, и мы делаем это, меняя местами числа в уравнениях и, наконец, меняя местами всю строку.
Пример:
20-3+5*2 #Input. | V 02-3+5*2 #reversed numbers of the equation. | v 2*5+3-20 #output.
Код:
class Solution { public: string reverseEqn (string s){ int i=0; int n = s.size(); while(i<n){ int j = i; while(j<n && (s[j] != '+' && s[j] != '-' && s[j] != '*' && s[j] != '/')){ j++; } reverse(s.begin()+i, s.begin()+j); i=j+1; } reverse(s.begin(), s.end()); return s; } };
Объяснение:
Внешний цикл используется для обхода всей строки, а внутренний цикл используется для поиска предыдущей позиции символа.
Метод reverse() в С++ используется в обратном порядке для заданного массива, где s.begin() указывает начальное местоположение строки, а s.end() указывает конечное местоположение строки.
Временная сложность: O(N)
Космическая сложность: O(1)
Заключение:
Надеюсь, что решение окажется полезным и вам, ребята, понравилось. Давайте обсудим новые подходы.
Удачного кодирования.