Details
- Difficulty: Hard
 - Programming language: Kotlin
 
Problem
Giving a string consisting of parentheses, single digits, positive and negative signs,
convert the string into a mathematical expression to obtain the answer.
Don't use eval or a similar built-in parser.
For example:
- Given 
-1+(2+3), you should return4 
Solution
Before looking at my solution, which is probably not the best, why don't you give it a try? ๐
I decide to simply use a simple switch case (when in Kotlin)
/**
 * Parse and calculate the string passed in param
 *
 * @param calculation
 * @return result of the calculation
 */
fun parseAndCalculation(calculation: String): Int {
    var result = 0
    var multiplier = 1
    var subProblem = -1
    for ((index, c) in calculation.withIndex()) {
        if(subProblem == -1 || c != ')')
            when(c) {
                '+' -> multiplier = 1
                '-' -> multiplier = -1
                '(' -> subProblem = index
                ')' -> {
                    result += multiplier * parseAndCalcul(calculation.substring(subProblem + 1, index))
                    subProblem = -1
                }
                else -> result += multiplier * c.toString().toInt()
            }
    }
    return result
}
    
Top comments (3)
Nice solution to the problem, but you can simplify. Addition is associative, e.g.
a+(b+c) = (a+b)+c = a+b+c
(Subtraction is trivially changed to addition 2 - 1 = 2 + -1. I see you have understood this).
As the parenthesis don't do anything, you can just ignore them. (I would set up a range a characters to ignore, and add whitespace to it as well)
I've got to go to a meeting now, but I'll post an F# version later - might be able to get it down to a single expression.
Oh! Really good idea, thank you ๐ I will try this. I don't have really looked into the different types of class there is in Kotlin. Thank you !
Indeed. :-(