如果我有一个很长的数字,例如1 ... 1000000,那么使用以下映射将它们转换为字符串的有效方法是什么?
1-> A,2-> B,3-> C,...... 10-> A0,11-> AA,12-> AB等。
我采用了将每个数字拆分为数字(使用模数)并使用它从数组中获取字符来构建字符串的方法。 1 ... 1000需要大约5秒钟。有更快的方法吗?
我的代码:
let numbers = 1...1000000
let charArray:[Character] = ["0","A","B","C","D","E","F","G","H","I"]
var results: [String] = []
func transformNumbers() {
for number in numbers {
var string = ""
var i = number
while i > 0 {string.insert(charArray[(i%10)], at: string.startIndex); i/=10}
results.append(string)
}
}
答案 0 :(得分:0)
不确定它是否是最快的方式,但切换到map
表达式而不是改变结果列表会使我的机器上的速度提高10倍以上:
let results = numbers.map { (val: Int) -> String in
var string = ""
var i = val
while i > 0 {string.insert(charArray[(i%10)], at: string.startIndex); i/=10}
return string
}
答案 1 :(得分:0)
我的旧MacBook上1...1000000
的代码大约需要15秒,下面的代码不到1秒:
(在MacOS 10.12.5上使用Xcode 8.3.3 with Release build)
let unicodeScalarArray:[UnicodeScalar] = ["0","A","B","C","D","E","F","G","H","I"]
let utf16CodeUnitArray:[UInt16] = unicodeScalarArray.map{UInt16($0.value)}
var results: [String] = []
func transformNumbers7() {
results = numbers.map {number in
var digits: [UInt16] = []
var i = number
while i > 0 {digits.append(utf16CodeUnitArray[i%10]); i/=10}
digits.reverse()
return String(utf16CodeUnits: digits, count: digits.count)
}
}
通常,
insert(_:at:)
可能比重复append(_:)
和reverse()
Character
可能效率低于UnicodeScalar
,UTF-16代码单位或UTF-8代码单位。