Skip to main content

DSA: Integer and Digit Array Conversion

DSA

Split a nonnegative integer into decimal digits using division, then rebuild it with reduce.

Use remainder and integer division to extract digits without converting the number to a string. The digits arrive in reverse order, so reverse the array once at the end.

func digits(of number: Int) -> [Int] {
    precondition(number >= 0)

    guard number != 0 else { return [0] }

    var number = number
    var digits: [Int] = []

    while number > 0 {
        digits.append(number % 10)
        number /= 10
    }

    digits.reverse()
    return digits
}

let result = digits(of: 123)
// [1, 2, 3]

Rebuild the integer by shifting the accumulated value one decimal place before adding each digit.

func integer(from digits: [Int]) -> Int {
    precondition(!digits.isEmpty)
    precondition(digits.allSatisfy { (0...9).contains($0) })

    return digits.reduce(0) { number, digit in
        number * 10 + digit
    }
}

let result = integer(from: [1, 2, 3])
// 123

This template handles nonnegative integers. Leading zeroes are not preserved when converting the digits back to an Int, and a result larger than Int.max traps on overflow.