微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

快速 – 将数字分解为一系列单个数字

如果我有整数123,我想将数字分成数组[1,2,3]这样做的最佳方法是什么?我已经搞砸了很多,我有以下工作:

var number = 123    
var digits = Array(String(number)).map{Int(strtoul((String($0)),nil,16))}

我看着它,觉得可能有更好/更简单的方法.如果没有,那么它可能会出现在网络搜索上.任何替代想法?

解决方法

更容易处理数字字符串的UTF-8表示
因为十进制数字的UTF-8代码单元可以很容易地转换为
通过减去常数得到相应的整数:

let asciiZero = UInt8(ascii: "0")
let digits = map(String(number).utf8) { Int($0 - asciiZero) }

事实证明这也明显更快.

如果性能是主要目标,那么您应该限制
简单整数运算的方法,不使用字符串
或字符:

var digits : [Int] = []
while number > 0 {
    digits.insert(number % 10,atIndex: 0)
    number /= 10
}

这是我完整的测试代码,为了您的方便(编译
在MacBook Pro上使用Xcode 6.4处于发布模式.

func digits1(number : Int) -> [Int] {
    let digits = Array(String(number)).map{Int(strtoul((String($0)),16))}
    return digits
}

func digits2(number : Int) -> [Int] {
    // Use a static property so that the constant is initialized only once.
    struct Statics {
        static let asciiZero = UInt8(ascii: "0")
    }

    let digits = map(String(number).utf8) { Int($0 - Statics.asciiZero) }
    return digits
}

func digits3(var number : Int) -> [Int] {
    var digits : [Int] = []
    while number > 0 {
        digits.insert(number % 10,atIndex: 0)
        number /= 10
    }
    return digits
}

func measure(converter: (Int)-> [Int]) {
    let start = NSDate()
    for n in 1 ... 1_000_000 {
        let digits = converter(n)
    }
    let end = NSDate()
    println(end.timeIntervalSinceDate(start))
}

measure(digits1) // 10.5 s
measure(digits2) // 1.5 s
measure(digits3) // 0.9 s

Swift 3更新:

func digits(_ number: Int) -> [Int] {
    var number = number
    var digits: [Int] = []
    while number > 0 {
        digits.insert(number % 10,at: 0)
        number /= 10
    }
    return digits
}

print(digits(12345678)) // [1,3,4,5,6,7,8]

这也比附加数字略快到一个数组并在最后反转它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐