美文网首页剑指offer算法系列——Swift版本
剑指offer—面试题17:打印从1到最大的n位数

剑指offer—面试题17:打印从1到最大的n位数

作者: FY_Chao | 来源:发表于2020-12-28 14:54 被阅读0次

输入数字 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 ""
    }
}

相关文章

网友评论

    本文标题:剑指offer—面试题17:打印从1到最大的n位数

    本文链接:https://www.haomeiwen.com/subject/wpnznktx.html