diff --git a/7.reverse-integer.org b/7.reverse-integer.org new file mode 100644 index 0000000..5f16fea --- /dev/null +++ b/7.reverse-integer.org @@ -0,0 +1,179 @@ +#+title: 7 Reverse Integer + +* Subject + +Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range \([-2^{31}, 2^{31} - 1]\), then return 0. + +Assume the environment does not allow you to store 64-bit integers (signed or unsigned). + +** Example 1: + +Input: x = 123 +Output: 321 + +** Example 2: + +Input: x = -123 +Output: -321 + +** Example 3: + +Input: x = 120 +Output: 21 + +** Constraints: + + -231 <= x <= 231 - 1 + +* Solution +#+name: lang +#+begin_src racket +#lang racket +#+end_src + +#+RESULTS: lang + +#+begin_src racket +#lang racket/base +(for/list ([i (in-naturals)] + #:break (> i 10)) + i) +#+end_src + +#+RESULTS: +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | + +#+name: ten-power-below +#+begin_src racket +(define/contract (ten-power-below x) + (-> exact-integer? exact-integer?) + (let ((power-of-ten 1)) + (for/list ([exponent (in-naturals)]) + #:break (> power-of-ten x) + (set! power-of-ten (* 10 power-of-ten))) + (/ power-of-ten 10))) +#+end_src + +#+RESULTS: ten-power-below + + +#+begin_src racket :noweb yes +#lang racket +<> +(ten-power-below 11) +#+end_src + +#+RESULTS: +: 10 + +#+begin_src racket :noweb yes +#lang racket +<> +(ten-power-below 100) +#+end_src + +#+RESULTS: +: 100 + +#+begin_src racket :noweb yes +#lang racket +<> +(ten-power-below 1111) +#+end_src + +#+RESULTS: +: 1000 + +#+begin_src racket :noweb yes +<> +(for/list ([i (list 1 100 271091029 (- 123001))]) + (ten-power-below i)) +#+end_src + +#+RESULTS: +| 1 | 100 | 1000000000 | 1 | + +#+name: reverse +#+begin_src racket :noweb yes +<> +(define/contract (reverse x) + (-> exact-integer? exact-integer?) + (cond ((= x 0) 0) + ((< x 0) (- (reverse (- x)))) + (#t (let* ((remains x) + (previous remains) + (number 0) + (power-of-ten (ten-power-below x)) + (current-number-power-of-ten 1) + (digit 0)) + (for/list ([i (in-naturals)] + #:break (< power-of-ten 1)) + (set! previous remains) + (set! remains (modulo remains power-of-ten)) + (set! digit (/ (- previous remains) power-of-ten)) + (set! number (+ number (* digit current-number-power-of-ten))) + (set! power-of-ten (/ power-of-ten 10)) + (set! current-number-power-of-ten (* current-number-power-of-ten 10)) + ) + number)))) +#+end_src + +#+RESULTS: reverse + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse 123) +#+end_src + +#+RESULTS: +: 321 + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse 21) +#+end_src + +#+RESULTS: +: 12 + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse -1) +#+end_src + +#+RESULTS: +: -1 + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse -124) +#+end_src + +#+RESULTS: +: -421 + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse 123456789012345678901234567890) +#+end_src + +#+RESULTS: +: 98765432109876543210987654321 + +#+begin_src racket :noweb yes +#lang racket +<> +(reverse 10) +#+end_src + +#+RESULTS: +: 1 + +* Reference + +https://leetcode.com/problems/reverse-integer/