剑指 Offer 17. 打印从1到最大的n位数
文章目录
- 解法1:回溯
https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/
难度:简单
输入数字 n
,按顺序打印出从 1
到最大的 n
位十进制数。比如输入 3
,则打印出 1
、2
、3
一直到最大的 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
,如 000
,001
,… 099
这样,因此我们还需要想办法去掉这些前缀 0
。
假设 n = 3
时,先不考虑 000
(全为 0
)的这种情况,观察数字组合,我们可以知道,最开始组合会有n-1 = 2
个前缀0
,然后是 1
个,什么时候前缀 0
变少了呢?就是当数字组合从 009
变为 010
时,前缀 0
数量减少了,也就是当组合中除了 0
以外的数字都是 9
之后,前缀 0
数量会减少 ,因此我们可以定义一个变量 mine
来计算当前组合中数字 9
的数量,假设我们前缀 0
的数量定义为 start
,当 n - 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位数相关推荐
- 【LeetCode】剑指 Offer 17. 打印从1到最大的n位数
[LeetCode]剑指 Offer 17. 打印从1到最大的n位数 文章目录 [LeetCode]剑指 Offer 17. 打印从1到最大的n位数 一.大数 一.大数 将 1~9 加入队列 对队列中 ...
- 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数
目录标题 算法汇总 题目 关键点 代码 1.解体方法 思路 代码 时间和空间复杂度 2.解题方法,如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总,包括GitHub源码地址链接:力 ...
- 力扣剑指 Offer 17. 打印从1到最大的n位数
题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 示例 1:输入: n = 1 输出: [1,2,3,4 ...
- 【算法】剑指 Offer 17. 打印从1到最大的n位数
文章目录 1.概述 2. 代码 2.1 自研 2.2 系统参数 2.3 大数 1.概述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 ...
- 剑指Offer:打印从1到最大的n位数
题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...
- [剑指offer]顺时针打印矩阵
[剑指offer]顺时针打印矩阵 剑指offer-顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4, ...
- 剑指offer 顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 则依次打印出数字1,2,3 ...
- 剑指offer 从头到尾打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 解决办法: import java.util.ArrayList; public class Solution {public ArrayLis ...
- 剑指offer之打印链表的倒数第N个节点的值
1 问题 打印链表的倒数第N个节点的值,(要求能只能便利链表一次) 比如链表如下,打印倒数第三个值就是4 1-> 2-> 3-> 4-> 5-> 6 2 思路 既然只要只 ...
最新文章
- Java重写equals和hashCode方法
- Java 代码细节与优化(一)
- php的图像处理有哪些实际作用,PHP_一个经典实用的PHP图像处理类分享,本图像处理类可以完成对图片 - phpStudy...
- Oracle 多表查询
- JavaScript常见设计模式梳理
- Protel99se基本教程 Protel 99SE从零开始学习教程视频教程
- “爱装X”开源组织:“教科书级”AI知识树究竟长什么样?
- UE4/UE5 导入abc文件总结
- java 读取xls、xlsx文件
- react全家桶介绍
- Android编程简介
- mysql2008连接不上_sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)...
- Java随笔记 - Java BIO,Socket通信
- 特征工程实践:泰坦尼克号幸存者预测
- 谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
- 护理和计算机哪个专业好,护理专业考研的就业前景和方向
- kde调整分辨率_7个很酷的KDE调整将改变您的生活
- 台式计算机各种接口的名称,值得收藏的电脑接口大全(图文版)
- java正则验证大陆以及港澳台手机号码
- 济宁:携手华为打造孔孟之乡的科技味儿