leetcode/7.reverse-integer.org

3.2 KiB

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

#lang racket
#lang racket/base
(for/list ([i (in-naturals)]
           #:break (> i 10))
  i)
0 1 2 3 4 5 6 7 8 9 10
(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)))
#lang racket
<<ten-power-below>>
(ten-power-below 11)
10
#lang racket
<<ten-power-below>>
(ten-power-below 100)
100
#lang racket
<<ten-power-below>>
(ten-power-below 1111)
1000
<<ten-power-below>>
(for/list ([i (list 1 100 271091029 (- 123001))])
  (ten-power-below i))
1 100 1000000000 1
<<ten-power-below>>
(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))))
#lang racket
<<reverse>>
(reverse 123)
321
#lang racket
<<reverse>>
(reverse 21)
12
#lang racket
<<reverse>>
(reverse -1)
-1
#lang racket
<<reverse>>
(reverse -124)
-421
#lang racket
<<reverse>>
(reverse 123456789012345678901234567890)
98765432109876543210987654321
#lang racket
<<reverse>>
(reverse 10)
1