← Back to table of contents

Reverse Integer

Digit extraction with place values

TimeO(log₁₀ n)SpaceO(1)Suboptimal
Uses floating point (Math.log10, Math.pow) and a single overflow check (newNumber > 2³¹) that is wrong for positive numbers: it allows 2³¹ when max positive is 2³¹−1. More state (two place-value counters) and harder to follow than the mod-10 approach.

Code

1
2function reverse(x: number): number {
3    if (Math.abs(x) < 10) {
4        return x
5    }
6
7    let newNumber = 0
8    const lowestSig = 1
9    const highestSig = Math.pow(10, Math.floor(Math.log10(Math.abs(x))))
10    let sigBackward = highestSig
11    let sigForward = lowestSig
12    let num = Math.abs(x)
13    while (sigBackward >= 1) {
14        // Get the last digit in the number so far
15        const digit = Math.floor(num/sigForward)%10 // 12345 with sigForward of 10 = 4
16        newNumber += (digit*sigBackward) // 4 * 100 = 400, for example
17        sigForward *= 10 // goes from 10 => 100 for example
18        sigBackward /= 10 // goest from 1000 => 100 for example
19    }
20    
21    if (newNumber > Math.pow(2,32)/2) {
22        return 0
23    }
24    return x < 0 ? -1*newNumber : newNumber
25}
26
27console.log(reverse(0));
28console.log(reverse(1000000000000000000));
29console.log(reverse (123));
30console.log(reverse(-123));
31

Animation

Examples
reverse(123) =321
reverse(-123) =-321
reverse(0) =0
reverse(120) =21