[LintCode]371.用递归打印数字
来源:互联网 发布:攻破网站数据库 编辑:程序博客网 时间:2024/06/05 13:02
用递归的方法找到从1到最大的N位整数。
注意事项
用下面这种方式去递归其实很容易:
recursion(i) { if i > largest number: return results.add(i) recursion(i + 1)}
但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?
样例
给出 N = 1
, 返回[1,2,3,4,5,6,7,8,9]
.
给出 N = 2
, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99]
.
第一种:用字符串模拟数字
class Solution {public: /** * @param n: An integer. * return : An array storing 1 to the largest number with n digits. */ vector<int> numbersByRecursion(int n) { vector<int> numarr; if(n == 0){ return numarr; } char * number = new char[n+1]; //bool flag = false; number[n] = '\0'; for(int i = 0; i< 10; i++){ number[0] = i + '0'; recursion(numarr,number,n,0); } delete [] number;//new 完后要记得释放内存 return numarr; } void recursion(vector<int> &numarr,char * num,int length ,int index){//这里之前写的是 vector<int numarr>,//如果是这样的话并没有把调用它的主函数中的numarr传进来,所以输出结果为[] if(index == length-1){ int num1 = atoi(num); if(num1 != 0) { numarr.push_back(num1); } return; } for(int i = 0; i< 10; i++){ num[index+1] = i+'0'; recursion(numarr,num,length, index+1); } return;//这里之前忘记写return了,这个是计算完第i位(i+1位后面的也计算完返回了,如果不加return,直接停在这一层,所以不会继续返回到第i-1位的计算当中) } };
第二种:递归的深度最多只有N层,说明每一位是一次递归,其实也就是先把i-1层的都算出来,再计算第i层的就行
class Solution {public: /** * @param n: An integer. * return : An array storing 1 to the largest number with n digits. */ vector<int> numbersByRecursion(int n) { vector<int> ret; if(n<=0) return ret; else if(n==1) { ret = {1,2,3,4,5,6,7,8,9}; return ret; } else { vector<int> temp = numbersByRecursion(n-1); copy(temp.begin(),temp.end(),back_inserter(ret)); for(int i=1;i<=9;i++) { ret.push_back(pow(10,n-1)*i); for(auto x:temp) { ret.push_back(pow(10,n-1)*i+x); } } return ret; } }};
第三种:做法类似于打印全排列,走一遍全排列的枚举树,从最高位开始一位一位地遍历,直到最低位形成一个数字,每一位都有0~9(十叉树)
class Solution {public: /** * @param n: An integer. * return : An array storing 1 to the largest number with n digits. */ vector<int> numbersByRecursion(int n) { if(n<=0) return vector<int>(); if(1==n) return {1,2,3,4,5,6,7,8,9}; vector<int> ret; //当前层的结果 vector<int> tmp=numbersByRecursion(n-1); //取用上一层的结果 copy(tmp.begin(),tmp.end(),back_inserter(ret)); //放进当前层中 for(int i=1;i<=9;++i){ //计算当前层的所有值 int base=pow(10,n-1)*i; ret.push_back(base); for(auto &e:tmp) //借用了上一层的结果 ret.push_back(base+e); } return ret; }};
class Solution {public: /** * @param n: An integer. * return : An array storing 1 to the largest number with n digits. */ vector<int> numbersByRecursion(int n) { if (n <= 0) return vector<int>(); vector<int> nums; dfs(nums, n, 0); return nums; } void dfs(vector<int>& nums, int n, int cur) { // n: 还剩下几位, cur: 当前数值 if (n == 0) { if (cur > 0) nums.push_back(cur); return; } for (int i = 0; i < 10; ++i) { dfs(nums, n - 1, cur * 10 + i); } }};
第五种:递归使得递归的深度最多为N。将1-10定为一层,10-100定为一层,那么输入n,最多就循环n层。
class Solution {public: /** * @param n: An integer. * return : An array storing 1 to the largest number with n digits. */ vector<int> ret; //存放数据 vector<int> numbersByRecursion(int n) { if( n<1 ){ return ret; } return print(1,n); //打印从1开始的n位数 } vector<int> print(int i, int n){ if( n>=1 ){ //依次将1-9,10-99,100-999放入容器内 int max = i*10; for(int j=i; j<max; j++){ ret.push_back(j); } print(max, n-1); } return ret; } };
阅读全文
0 0
- [LintCode]371.用递归打印数字
- LintCode-用递归打印数字
- LintCode 用递归打印数字
- lintcode-用递归打印数字
- Lintcode 用递归打印数字
- LintCode 用递归打印数字
- 用递归打印数字-LintCode
- lintcode(371)用递归打印数字
- LintCode-剑指Offer-(371)用递归打印数字
- [LintCode] 用递归打印数字 Print Numbers by Recursion
- 用递归打印数字
- 用递归打印数字
- 递归打印数字
- 【递归】数字打印
- 递归打印螺旋数字
- 371.Print Numbers by Recursion-用递归打印数字(中等题)
- Lintcode 用递归打印从1到N位的最大整数
- 0021利用递归算法打印数字金字塔
- mongodb常用命令
- 花书学习笔记(1) 范数、特征分解、奇异值分解、伪逆、自信息
- Flomerics Floemc 6.1(lic carcak) 电磁兼容性的分析
- MapReduce计数器
- Phoenix的数据类型和操作符、函数
- [LintCode]371.用递归打印数字
- 面向对象 时钟
- 记npm包开发全过程
- IO补充
- rem 等比例样式
- HDU 6106-Classes
- 原生js实现数组去重的5种方法
- 华为抢了腾讯的利益,腾讯却拿用户数据说事
- 非wifi用户选在图片加载模式