輸入數(shù)字 n,按順序打印出從 1 到最大的 n 位十進(jìn)制數(shù)瑞你。比如輸入 3酪惭,則打印出 1、2者甲、3 一直到最大的 3 位數(shù) 999春感。
粗一看題目就感覺(jué)很簡(jiǎn)單,馬上就能寫(xiě)出答案的那種虏缸?
func printNumbers(_ n: Int) -> [Int] {
return Array.init(1..<Int(pow(10.0, Double(n))))
}
如果在力扣上面提交鲫懒,ok,通過(guò)啦刽辙!但是本題在原書(shū)的考點(diǎn)是考慮到大數(shù)越界情況下窥岩,考慮輸出的數(shù)值可能會(huì)超過(guò) Int 的最大值。但是這個(gè)算法只考慮了正常的數(shù)字范圍宰缤。所以我們還需優(yōu)化,使用字符串表示數(shù)值颂翼。
從1到n位數(shù),考慮每位數(shù)值的可能性都是從 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 ""
}
}