美文网首页剑指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