快速 – 将数字分解为一系列单个数字
发布时间:2020-12-14 04:57:36 所属栏目:百科 来源:网络整理
导读:如果我有整数123,我想将数字分成数组[1,2,3]这样做的最佳方法是什么?我已经搞砸了很多,我有以下工作: var number = 123 var digits = Array(String(number)).map{Int(strtoul((String($0)),nil,16))} 我看着它,觉得可能有更好/更简单的方法.如果没有,那么
如果我有整数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 } 这是我完整的测试代码,为了您的方便(编译 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] 这也比附加数字略快到一个数组并在最后反转它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |