前n个正整数相乘的时间复杂度为_剑指offer_go_面试题17_打印从1到最大的n位数

题目

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。

比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

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

说明:

用返回一个整数列表来代替打印

n 为正整数

解题思路分析

1、求最大;时间复杂度O(10^n),空间复杂度O(10^n)

4819ab75bf9d54ad197ea01c75db8680.png
func printNumbers(n int) []int {res := make([]int, 0)maxValue := 0for n > 0 {maxValue = maxValue*10 + 9n--}for i := 1; i <= maxValue; i++ {res = append(res, i)}return res}

2、求最大;时间复杂度O(10^n),空间复杂度O(10^n)

func printNumbers(n int) []int {res := make([]int, 0)maxValue := 1for i := 1; i <= n; i++ {maxValue = maxValue * 10}maxValue = maxValue - 1for i := 1; i <= maxValue; i++ {res = append(res, i)}return res}

3、递归+全排列;时间复杂度O(10^n),空间复杂度O(10^n)

var temp []stringfunc printNumbers(n int) []int {if n <= 0 {return nil}temp = make([]string, 0)arr := make([]rune, n)for i := 0; i < 10; i++ {arr[0] = rune(i + '0')dfs(arr, n, 0)}res := make([]int, 0)for i := 0; i < len(temp); i++ {value, _ := strconv.Atoi(temp[i])res = append(res, value)}return res}func dfs(arr []rune, n int, index int) {if index == n-1 {if printNum(arr) != "" {temp = append(temp, printNum(arr))}return}for i := 0; i < 10; i++ {arr[index+1] = rune(i + '0')dfs(arr, n, index+1)}}func printNum(arr []rune) string {res := ""isBeginning := truefor i := 0; i < len(arr); i++ {if isBeginning && arr[i] != '0' {isBeginning = false}if !isBeginning {res = res + string(arr[i])}}return res}

4、模拟进位;时间复杂度O(10^n),空间复杂度O(10^n)

func printNumbers(n int) []int {res := make([]int, 0)if n <= 0 {return nil}temp := make([]string, 0)arr := make([]rune, n)for i := 0; i < len(arr); i++ {arr[i] = '0'}for !increment(arr) {if printNum(arr) != "" {temp = append(temp, printNum(arr))}}for i := 0; i < len(temp); i++ {value, _ := strconv.Atoi(temp[i])res = append(res, value)}return res}func increment(arr []rune) bool {isOverflow := falsenTakeOver := 0for i := len(arr) - 1; i >= 0; i-- {sum := int(arr[i]-'0') + nTakeOverif i == len(arr)-1 {sum++}if sum >= 10 {if i == 0 {isOverflow = true} else {sum = sum - 10nTakeOver = 1arr[i] = rune('0' + sum)}} else {arr[i] = rune('0' + sum)break}}return isOverflow}func printNum(arr []rune) string {res := ""isBeginning := truefor i := 0; i < len(arr); i++ {if isBeginning && arr[i] != '0' {isBeginning = false}if !isBeginning {res = res + string(arr[i])}}return res}

总结

Easy题目,剑指offer书上没有限制n的大小,主要考察模拟进位和全排列+递归解决方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值