文章目录

  • 解法1:回溯

https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/

难度:简单


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

示例 1:

  输入: n = 1

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

  说明:

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

  • n 为正整数

解法1:回溯

  这题正常来说思路是非常简单的,一个 n (n为正整数)位的数,最大值为 10n−110^n - 110n−1 ,且返回类型为 int ,因此不需要考虑超过 MAX_INT 的情况,只要一次遍历即可得出答案:

int* printNumbers(int n, int* returnSize){int max = pow(10, n);int i;int* res = malloc(sizeof(int) * max);for (i = 1; i < max; i++) {res[i-1] = i;}*returnSize = max - 1;return res;
}

不过真正面试写这题时,这样的写法肯定是不行的!

  我们必须考虑大数的情况,而大数除了使用 long long 或 JAVA 中的 BigInteger ,不过这样仍是有范围限制,所以一般会使用数组或字符串来进行表示一个很大的数。

  因此,以数组或字符串的方式来考虑,从 1 到 10n−110^n-110n−1 的这些数字,也可以看做数字是 0 ~ 9 的组合,而对于组合的获取,一般能使用回溯解决。

  在递归函数中,我们以从高位向低位的顺序选取组合数字,如 1024 ,我们先选取数字 1 ,再选取数字 0 ,再选取数字 2 ,最后选取 4 这样。

  不过,由于我们需要从 0 开始选取,因此结果中会有前缀 0 ,如 000001,… 099 这样,因此我们还需要想办法去掉这些前缀 0

  假设 n = 3 时,先不考虑 000 (全为 0 )的这种情况,观察数字组合,我们可以知道,最开始组合会有n-1 = 2 个前缀0,然后是 1 个,什么时候前缀 0 变少了呢?就是当数字组合从 009 变为 010 时,前缀 0 数量减少了,也就是当组合中除了 0 以外的数字都是 9 之后,前缀 0 数量会减少 ,因此我们可以定义一个变量 mine 来计算当前组合中数字 9 的数量,假设我们前缀 0 的数量定义为 startn - start = mine 时,这时候组合中除了 0 其他数字就都是 9(总共 n 位数,减去前缀 0 的数量 start,剩余个数和 9 的数量相同,因此剩余数字都为 9)。

  最后,在获得所有数字组合后,去掉结果数组的第一位 000 ,就得到了我们想要的结果了。

按照这种思路,JS 代码如下:

var printNumbers = function(n) {let res = [];let temp = [];let nums = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];let start = n - 1;let mine = 0;const dfs = index => {if (index === n) {// 获取第 start - 结尾的数字组合,即去除前缀 0 res.push(temp.slice(start).join(''));return;}for (let num of nums) {// 记录当前数字组合中 9 的个数if (num === '9') {mine++;}temp[index] = num;dfs(index+1);// 若全为 9 ,则之后的组合,前缀 0 的数量减少一个 if (n - start === mine) {start--;}// 最后恢复 mine 的数量if (num === '9') {mine--;}}};dfs(0);// 去除全为 0 的数字组合res.shift();return res;
};

剑指 Offer 17. 打印从1到最大的n位数相关推荐

  1. 【LeetCode】剑指 Offer 17. 打印从1到最大的n位数

    [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 文章目录 [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 一.大数 一.大数 将 1~9 加入队列 对队列中 ...

  2. 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数

    目录标题 算法汇总 题目 关键点 代码 1.解体方法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码地址链接:力 ...

  3. 力扣剑指 Offer 17. 打印从1到最大的n位数

    题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 示例 1:输入: n = 1 输出: [1,2,3,4 ...

  4. 【算法】剑指 Offer 17. 打印从1到最大的n位数

    文章目录 1.概述 2. 代码 2.1 自研 2.2 系统参数 2.3 大数 1.概述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 ...

  5. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...

  6. [剑指offer]顺时针打印矩阵

    [剑指offer]顺时针打印矩阵 剑指offer-顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4, ...

  7. 剑指offer 顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3 ...

  8. 剑指offer 从头到尾打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. 解决办法: import java.util.ArrayList; public class Solution {public ArrayLis ...

  9. 剑指offer之打印链表的倒数第N个节点的值

    1 问题 打印链表的倒数第N个节点的值,(要求能只能便利链表一次) 比如链表如下,打印倒数第三个值就是4 1-> 2-> 3-> 4-> 5-> 6 2 思路 既然只要只 ...

最新文章

  1. Java重写equals和hashCode方法
  2. Java 代码细节与优化(一)
  3. php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...
  4. Oracle 多表查询
  5. JavaScript常见设计模式梳理
  6. Protel99se基本教程 Protel 99SE从零开始学习教程视频教程
  7. “爱装X”开源组织:“教科书级”AI知识树究竟长什么样?
  8. UE4/UE5 导入abc文件总结
  9. java 读取xls、xlsx文件
  10. react全家桶介绍
  11. Android编程简介
  12. mysql2008连接不上_sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)...
  13. Java随笔记 - Java BIO,Socket通信
  14. 特征工程实践:泰坦尼克号幸存者预测
  15. 谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
  16. 护理和计算机哪个专业好,护理专业考研的就业前景和方向
  17. kde调整分辨率_7个很酷的KDE调整将改变您的生活
  18. 台式计算机各种接口的名称,值得收藏的电脑接口大全(图文版)
  19. java正则验证大陆以及港澳台手机号码
  20. 济宁:携手华为打造孔孟之乡的科技味儿

热门文章

  1. 《包容的智慧》读后感-包容有多少,拥有就有多少
  2. 2021学科排名:中国12个工科世界第一,网友:全是不吃香的
  3. 干掉Spring Cloud,这个框架是微服务的未来!
  4. 微前端在美团外卖的实践
  5. 兄弟,用大白话告诉你小白都能看懂的Hadoop架构原理
  6. Redis 深度历险:核心原理与应用实践
  7. 通过COLA看应用架构
  8. 如何衡量产品的用户体验?
  9. 传递函数极点与微分方程的解
  10. easyUI添加行操作