文章目录

  • 题目
  • 思路
  • 代码

题目

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

示例 1:

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

说明:

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

来源:力扣(LeetCode)


思路

在力扣里这道题不用考虑大数。但是还是想自己写一个以备不虞。

重点:

  1. string 处理大数。
  2. 处理每一位时,将 int 转换为 char
  3. 递归+分治 的思想生成 位数n 对应的 全排列
  4. 将生成的全排列依次压入 vector<int> 中,按题目要求返回整数列表。

细节:

  • 第一点无需赘述。

  • 关于第二点:

我们知道 string 每一位下标对应的元素其类型都是 char 的(字符串由字符组成嘛)。

那代码实现应该怎么写呢?是这样吗?

s[digit] = (char)i;

答案是否定的。来看这么一段代码:

可以看到输出结果不是4,而是52。

简单的 (char)i 起到的作用是将 i 变为 ASCII码为i的字符,上图中,因为字符’4’ 的ASCII码为52,因此 char(52) 会得到 字符'4'

换言之,s[digit] = (char)i; 得到的是 ASCII码为i时对应的字符 ,而非 字符'i'

正确处理 intchar 应为(例如:将整数4转换为字符4):

上图代码的本质也就是 0的ASCII码(48)+4 得到 ASCII码52,其对应的字符便是 '4'

值得一提的是,通过 + '0'int 转换为 char 并非总是可行的。当整数大于9时, + '0' 操作得到的便不再是数字字符了:

当然对于本题来讲并不存在这样的问题,因为我们仅仅是转换每个数位上的数字(它们在0~9之间)。

  • 关于第三点,也是本题最重要的部分:

全排列思想如下图所示(图源大佬:jyd):

代码中用 dfs函数 实现:

  1. 用分治思想先固定高位(digit=0) string[digit](图中蓝色部分)
  2. 再依次固定低位(digit+1),将 digit+1 作为新参数传入 函数dfs(图中红色部分)
  3. digit == n 时,此时已将每一位都处理完了,将string转换为int,并判断int是否为0,不为0则加入用来保存结果的 vector<int> 。(将string转换为int之后的操作仅仅是针对本题要求的返回证书列表,如果真的需要考虑大数的情况应该返回 vector<string>。)
  4. 经过上面三步仅仅处理完了高位0~9中的一种情况,接下来应该改变高位的值,重复上述步骤,直至处理完高位为9的情况,才真正完成了整个全排列的流程。

代码

class Solution {vector<int> iv;void dfs(int n, int digit, string& s){if(n == digit){ // 位数处理完毕int val = std::stoi(s);if(val){iv.push_back(val); }return;}for(int i = 0; i < 10; i++){s[digit] = i + '0'; // int -> chardfs(n, digit+1, s);}}
public:vector<int> printNumbers(int n) {string s(n, '0');dfs(n, 0, s);return iv;}
};

n位数的全排列(需要考虑大数的情况)相关推荐

  1. 什么时候用到全排列_【什么情况下要除以一个全排列?举例说明最好,万分感激,】作业帮...

    高中数学分组分配问题,什么情况下要除以一个全排列? 平均分组,一定要除以组数的全排列.  分组不同于排列,因为排列要顺序,而分组,组与组之间是没有顺序的. 例如:把1,2,3,4,5,6分为三组每组 ...

  2. 打印1到最大的n位数

    这道题是面试过可能会遇到的手写代码题.如n为3时,那么需要打印1到999.需要注意的是当输入的n很大时,最大的n位数是不能通过int或者long long int来表示,此时可以使用字符数组来存储. ...

  3. 打印1到最大的n位数(Java)

    题目: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 第一思路: 首先计算出n位数的最大十进制数,然后利用循环输出从1到最大的n位数. ...

  4. 打印从1到最大的n位数

    打印从1到最大的n位数 [题目]: 输入数字n,按顺序打印从1到最大的n位十进制数.比如输入3,则打印1,2,3,-,999. [解体思路]: 这个题目需要考虑大数的问题,使用字符串来表示这个数字,然 ...

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

    文章目录 解法1:回溯 https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/ 难度:简单   输入数字 ...

  6. 《剑指offer》c++版本 17.打印从1到最大的N位数

    如题: 题意就是从1打印直到n位数的最大值,即999999999.........一看就是循环的逻辑.需要注意的地方,除了非法的n之外,就是大数问题了.n太大的话,啥类型都存储不了.普通的解法是使用一 ...

  7. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  8. 全排列及相关扩展算法(二)——求字典序下一组排列及全排列算法

    1.字典序排列的定义:为了便于理解,以数字为例,对于数字1.2.3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的.例如对于5个数字的排列 12354和12345,排 ...

  9. 【算法】大数乘法问题及其高效算法

    题目 编写两个任意位数的大数相乘的程序,给出计算结果.比如: 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:15185 ...

最新文章

  1. 2009-ISIS命令与配置实验手册(可下载)
  2. ACE库的LOGGING记录使用摘要(1)
  3. C#中的{n}运算符
  4. androidEditTextinputType及android:imeOptions=”actionDone”(转)
  5. Spring4新特性——核心容器的其他改进
  6. Android or iOS 运行 meteor App 屏幕一片空白 White screen的解决方法
  7. 所谓情商高就是会说话
  8. Angular Component模板里的元素,运行时如何被生成并插入到DOM tree中
  9. android 监听安装来源_Flutter插件开发之APK自动安装
  10. 【操作系统】进程的组织
  11. div盒子水平垂直居中的方法
  12. 添加Centos缺失的命令
  13. SpringMvc @PathVariable 工作原理
  14. 小米案例分析PPT模板
  15. 三菱PLC的MX_COMPONENT安装过程
  16. 电子版本GB50017-2017钢结构设计标准规范手册共二册含条文说明(共52份,605M)
  17. IPVS使用的Netfilter Hook点
  18. WebRoot与WebContent区别
  19. 帝国CMS安全设置大全
  20. ffmpeg安装教程(支持10bit编码)

热门文章

  1. python关键词提取_python对文件中的关键词查找替换,实现自动获取配置
  2. asterisk账号和拨号方案mysql存储(静态)
  3. YUV422格式信号格式(以备学习之用)
  4. WinCE中得Catalog Items前的标记图标的意义总结
  5. android 动画 返回,Android“菜单图标变返回”动画
  6. php获取跳转前的地址,PHP获取短链接跳转后的真实地址和响应头信息的方法
  7. 【转】xilinx usb下载器 速度高速极限设置 JTAG-SMT2 JTAG-HS2 JTAG-HS3和Platform Cable USB DLC9 DLC10速度测试
  8. 【转】!C#中的Stream相关
  9. 【编译原理】学习LUA
  10. JAVA-入门(内含jdk配置)