剑指offer——面试题12:打印1到最大的n位数

此题在牛客网上没有OnlineJudge,在此补充两种做法。
参考网址:https://blog.csdn.net/yanxiaolx/article/details/52049810
题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
陷阱:用整数会溢出。考虑大数问题,就是输入的数字非常大的情况,如100,怎么表示100位的数呢,可以用字符串保存。
细节问题:
1.字符串递增的溢出判断
2.打印时过滤0

Solution1:

用字符串模拟加法。
使用字符串数组表示大数,最直观的方法是字符串里每个字符都是’0’到’9’之间的某一个字符,用来表示数字中的一位。因为数字最大是n位的,因此我们需要一个长度为n+1的字符串(字符串中最后一个是结束号’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。
首先把字符串中的每一个数字都初始化为’0’,然后每一次为字符串表示的数字加1,再打印出来。因此只需要做两件事:一是在字符串表达的数字上模拟加法,二是把字符串表达的数字打印出来。
在这里定义了函数PrintNumber,在这个函数里,只有在碰到第一个非0的字符之后才开始打印,直至字符串的结尾。

Solution2:

思路:将n位数看做排列组合问题,以3位数为例,有3个位置,每个位上从0到9中选一个数字放进去,求所有的排列情况。三个位置是依次放进去数字的,这可以用递归。每个位置上0到9的十种情况可以用for循环来遍历。另外,记得函数最开始进入时要检查边界条件。

#include <iostream>
#include <vector>
#include <string>
using namespace std;//打印1到最大N位数字
void PrintNumber(string &number);
//字符串number表示一个数字,在 number上增加1,如果做加法溢出,返回true;否则为false
bool Increment(string &number);
//数字全排列递归法
void Print1ToMaxOfNDigitsRecursively(string number, int length, int index);// ====================方法一====================
void Print1ToMaxOfNDigits_1(int n) {if (n <= 0) {cout << "n必须为正整数,参数错误!" << endl;return;}string number(n, '0');while (!Increment(number)) //没有溢出则继续打印数字PrintNumber(number);return;
}// 字符串number表示一个数字,在 number上增加1,如果做加法溢出,则返回true;否则为false
bool Increment(string &number) {bool isOverflow = false; //标记是否溢出int carry = 0;//进位int nLength = number.size();for (int i = nLength - 1; i >= 0; i--) { //从最低位一直加到最高位//将字符串number变为整数,后面才可以自++运算int nSum = number[i] - '0' + carry;if (i == nLength - 1)//最低位nSum++;//对应着加1操作if (nSum >= 10) { //判断是否需要进位if (i == 0)//当目前是最高位切需要进位时,则溢出isOverflow = true;else { //非最高位进位处理nSum -= 10;carry = 1;number[i] = '0' + nSum;//将整数number变为字符串,方便后面进行打印}} else { //不需要进位时,加1后跳出循环number[i] = '0' + nSum;break;}}return isOverflow;
}// ====================方法二====================
void Print1ToMaxOfNDigits_2(int n) {if (n <= 0) {printf("n必须为正整数,参数错误!");return;}//数字全排列的写法需牢记!!!string number(n, '0');Print1ToMaxOfNDigitsRecursively(number, n, 0);return;
}//数字全排列递归法
void Print1ToMaxOfNDigitsRecursively(string number, int length, int index) {//到了最后一位数字,递归结束if (index == length) {PrintNumber(number);return;}for (int i = 0; i < 10; i++) {//整数转为字符串number[index] = i + '0';Print1ToMaxOfNDigitsRecursively(number, length, index + 1);}
}// ====================公共函数====================
// 字符串number表示一个数字,数字有若干个0开头, 打印出这个数字,并忽略前面的0
void PrintNumber(string &number) {bool isBeginning = true;int nLength = number.size();for (int i = 0; i < nLength; i++) {if (isBeginning&&number[i] != '0') { //找到起点isBeginning = false;}if (!isBeginning)cout << number[i];}cout << endl;
}// ====================测试代码====================
void Test(int n) {cout << "Test for "<< n << " begins(方法一):" << endl;Print1ToMaxOfNDigits_1(n);cout << endl;cout << "Test for " << n << " begins(方法二):" << endl;Print1ToMaxOfNDigits_2(n);cout << endl;cout << "Test for " << n << " ends." << endl;
}int main() {Test(1);Test(2);//Test(3);Test(0);Test(-1);return 0;
}

注意:重点学习数字全排列的写法!!!

(补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数相关推荐

  1. 剑指offer面试题[12]-打印1到最大的n位数

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例. 对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1 ...

  2. 剑指Offer - 面试题17. 打印从1到最大的n位数

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

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

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

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

    题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 思路 详见链接 代码 class Solution:def ...

  5. 剑指offer——面试题61:按之字形顺序打印二叉树

    剑指offer--面试题61:按之字形顺序打印二叉树 Solution1: 基于上一题的解法,缺点:效率低下! /* struct TreeNode {int val;struct TreeNode ...

  6. 剑指offer——面试题60:把二叉树打印成多行

    剑指offer--面试题60:把二叉树打印成多行 Solution1: 20180911重做.经典题目.牢记做法! /* struct TreeNode {int val;struct TreeNod ...

  7. 剑指offer——面试题23:从上往下打印二叉树

    剑指offer--面试题23:从上往下打印二叉树 Solution1: 典型的BFS算法! 思路一开始没想到,按照书上的思路写的答案... 注意:deque是双向队列,在头尾插入都很快! /* str ...

  8. 剑指offer——面试题20:顺时针打印矩阵

    剑指offer--面试题20:顺时针打印矩阵 Solution1: 可参考leetCode 54题的解法 书上的思路特别好,学习之~ class Solution { public:vector< ...

  9. 剑指offer——面试题5:从尾到头打印链表

    剑指offer--面试题5:从尾到头打印链表 Solution1:我的答案 /** * struct ListNode { * int val; * struct ListNode *next; * ...

最新文章

  1. GitLab 配置邮箱
  2. cpu使用时间百分比过高 排查
  3. datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
  4. Spring contextLoaderListener源码学习
  5. C/C++ select fd_set解释
  6. pv原语模拟实现_并发编程信号量的使用方法和其实现原理
  7. springboot中添加静态资源的方式,默认的静态资源文件夹有哪些
  8. tpl_main_page.php
  9. PDF虚拟打印机(pdfFactory) v5.11 官方版
  10. 【科普向】5G核心网架构和关键技术
  11. 把RAdam和LookAhead合二为一
  12. 俄罗斯卢布为什么整个2016年都在升值?
  13. VC++海康威视视频人数流量统计数据库连接
  14. 在spring security手动 自定义 用户认证 SecurityContextHolder
  15. Linux通过Nodejs的IPP库实现自动定时打印
  16. $Loj10155$ 数字转换(求树的最长链) 树形$DP$
  17. python英译汉库模块_Python 进阶之路-翻译模块
  18. 玲珑杯 1032 A-B
  19. weblogic11G bea000449怎么解决
  20. 西安思源中学2021高考成绩查询入口,2021年西安各高中高考成绩排名及放榜最新消息...

热门文章

  1. JavaScript 弹出层,背景变暗
  2. c语言文件操作常用函数及读写文件代码举列
  3. VIO-为什么要进行在线时间标定
  4. (3)通过输入参数(测量数据)构建三维体模型(02)
  5. 怎么获取求生之路服务器信息失败,新人服务器出现问题 求助求助!!!!!...
  6. 华为鸿蒙os和麒麟os区别,麒麟、鸿蒙皆自研,为何华为不像苹果将系统同时推送?...
  7. matplotlib输出图形到网页_pytorch使用matplotlib和tensorboard实现模型和训练的可视化...
  8. Python数据结构与算法(1.4)——Python基础之控制结构
  9. Python-Matplotlib可视化(8)——图形的输出与保存
  10. svn关键字替换_SVN关键字替换示例