[LintCode]371.用递归打印数字
2017-08-20 00:28
204 查看
用递归的方法找到从1到最大的N位整数。
注意事项
用下面这种方式去递归其实很容易:
但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?
样例
给出
给出
第一种:用字符串模拟数字
第二种:递归的深度最多只有N层,说明每一位是一次递归,其实也就是先把i-1层的都算出来,再计算第i层的就行
第三种:做法类似于打印全排列,走一遍全排列的枚举树,从最高位开始一位一位地遍历,直到最低位形成一个数字,每一位都有0~9(十叉树)
第四种:
第五种:递归使得递归的深度最多为N。将1-10定为一层,10-100定为一层,那么输入n,最多就循环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 4000 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 = '\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; } };
相关文章推荐
- LintCode-371.用递归打印数字
- lintcode(371)用递归打印数字
- LintCode-剑指Offer-(371)用递归打印数字
- 用递归打印数字-LintCode
- LintCode 用递归打印数字
- [LintCode] 用递归打印数字 Print Numbers by Recursion
- 371 - 用递归打印数字
- LintCode 用递归打印数字
- Lintcode 用递归打印数字
- LintCode-用递归打印数字
- 用递归打印数字
- C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)
- 【递归】数字打印
- 打印有重复数字的数列的 一个递归解法
- 递归连续数 打印出0~9的数字,请补充缺少的代码。
- 1,2,3…n*n 的数字按照顺时针螺旋的形式打印成矩阵(递归)
- lintcode-用递归打印数字
- 合法IP&窗口最大值数组&打印素数&递归逆序一个栈&栈排序另一个栈&MyString&寻找数组中出现的重复字符&数组中的重复数字&逆序打印链表&空格替换成%20
- 递归回溯与迭代回溯算法框架,打印在n个数字中取k个数字的所有可能
- 递归打印数字