输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
粗一看题目就感觉很简单,马上就能写出答案的那种?
func printNumbers(_ n: Int) -> [Int] {
return Array.init(1..<Int(pow(10.0, Double(n))))
}
如果在力扣上面提交,ok,通过啦!但是本题在原书的考点是考虑到大数越界情况下,考虑输出的数值可能会超过 Int 的最大值。但是这个算法只考虑了正常的数字范围。所以我们还需优化,使用字符串表示数值。
从1到n位数,考虑每位数值的可能性都是从 0-9。每一位都有可能是0-9,且高位不能为0
class Solution {
var results = Array<String>()
func printNumbers(_ n: Int) -> [String] {//
var number = [Character](repeating: "0", count: n)
for i in 0..<10 {
number[0] = Character("\(i)")
recursive(&number, n, 0)
}
results.removeFirst()
return results
}
func recursive(_ number:inout Array<Character>,_ length:Int,_ index:Int) {
if index == length - 1 {
let string = number.map(String.init).joined(separator: "")
results.append(printNum(number:string))
return
}
for i in 0..<10 {
number[index + 1] = Character("\(i)")
recursive(&number, length, index + 1)
}
}
func printNum(number: String) -> String {
var isBeginin0 = true
let length = number.count
for i in 0..<length {
let startIndex = number.index(number.startIndex, offsetBy: i)
let char = number[startIndex]
if isBeginin0 && char != "0" {
isBeginin0 = false
}
let endIndex = number.index(number.startIndex, offsetBy: length)
if !isBeginin0 {
return String(number[startIndex..<endIndex])
}
}
return ""
}
}
网友评论