面试题17. 打印从1到最大的n位数

打印从1到最大的n位数

题目描述

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。


示例:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]


提示:
用返回一个整数列表来代替打印
n为正整数

转载来源:力扣(LeetCode)


题目分析

这题似乎没什么考点,因为他给出的限制太少了,如果是我出题,会有下面的出法:

  • 卡时间,求出最大的数要算10^n,考点是要用快速幂快速求size
  • 大数打印,一部分的数爆int甚至是爆long,可以用多个整型数来代表高低位来打印,或者用字符串

在这里我写了一个普通的getSize和用快速幂求解的getSize
快速幂
举个例子:

计算10^10
普通方法:10*10*....*10 一共计算十次乘法
快速幂法:10^10 = 10^5 * 10^5
这里只要计算一次105,然后平方就可,省去一次105的运算,但是增加了一次,以此类推,10^5 = 10^2 * 10^2 *10,显然,这可以看成是一个二分的过程,通过递归调用将大的幂运算分成小的幂运算,时间复杂度由O(N)下降到了O(logN)

class Solution {
        fun printNumbers(n: Int): IntArray {
        val size = simpleGetSize(n)
        return IntArray(size-1){it+1}
    }
//普通幂运算
    fun simpleGetSize(n: Int):Int{
        var size = 1
        for(i in 0 until n){
            size *= 10
        }
        return size
    }
//递归法快速幂运算,计算m^n的时候,只需要将10替换成m
   fun fastGetSize(n: Int):Int{
        if(n == 1)
            return 10
        val tmp = fastGetSize(n/2)
        if(n and 1 == 0){
            return tmp * tmp
        } else{
            return tmp * tmp * 10
        }
    }
}

代码文件


面试题17. 打印从1到最大的n位数_第1张图片

你可能感兴趣的:(面试题17. 打印从1到最大的n位数)