题目

用递归的方法找到从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].

注意

用下面这种方式去递归其实很容易:

  1. recursion(i) {
  2. if i > largest number:
  3. return
  4. results.add(i)
  5. recursion(i + 1)
  6. }

但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?

挑战

用递归完成,而非循环的方式

解题

非递归最简单了,先求出最大的n位数N,然后顺序遍历求解

  1. public class Solution {
  2. /**
  3. * @param n: An integer.
  4. * return : An array storing 1 to the largest number with n digits.
  5. */
  6. public List<Integer> numbersByRecursion(int n) {
  7. // write your code here
  8. int N = 1;
  9. for(int i = 1;i<=n;i++){
  10. N = N*10;
  11. }
  12. N = N - 1;
  13. List<Integer> result = new ArrayList<Integer>();
  14. for(int i =1;i<= N ;i++){
  15. result.add(i);
  16. }
  17. return result;
  18. }
  19. }

Java Code

总耗时: 1629 ms

  1. class Solution:
  2. # @param n: An integer.
  3. # return : A list of integer storing 1 to the largest number with n digits.
  4. def numbersByRecursion(self, n):
  5. # write your code here
  6. N = 1
  7. for i in range(n):
  8. N *=10
  9. result = []
  10. for i in range(1,N):
  11. result.append(i)
  12. return result

Python Code

总耗时: 674 ms

给的递归方式,运行到74%RunTime Error

  1. public class Solution {
  2. /**
  3. * @param n: An integer.
  4. * return : An array storing 1 to the largest number with n digits.
  5. */
  6. public List<Integer> numbersByRecursion(int n) {
  7. // write your code here
  8. int N = 1;
  9. for(int i = 1;i<=n;i++){
  10. N = N*10;
  11. }
  12. N = N - 1;
  13. List<Integer> result = new ArrayList<Integer>();
  14. getPrint(1,N,result);
  15. return result;
  16. }
  17. public void getPrint(int i,int N,List<Integer> result ){
  18. if(i>N)
  19. return ;
  20. result.add(i);
  21. getPrint(i+1,N,result);
  22. }
  23. }

Java Code

参考程序来源

  1. public int PrintN(int n,List<Integer> res){
  2. if(n==0){
  3. return 1;
  4. }
  5. int base = PrintN(n-1,res);
  6. int size = res.size();
  7. for(int i = 1;i<= 9;i++){
  8. int subbase = base*i;
  9. res.add(subbase);
  10. for(int j= 0;j< size ;j++){
  11. res.add(subbase+res.get(j));
  12. }
  13. }
  14. return base*10;
  15. }

上面是关键程序

在求 n-1位数到n位数的时候,先求n-2位数到n-1位数,就如同下面一样,这个很明显是找规律了。。。

lintcode:递归打印数字的更多相关文章

  1. LintCode-371.用递归打印数字

    用递归打印数字 用递归的方法找到从1到最大的N位整数. 注意事项 用下面这种方式去递归其实很容易: recursion(i) { if i > largest number: return re ...

  2. 【递归】数字三角形 简单dp

    [递归]数字三角形 题目描述 对于大多数人来说,“我们是这么的正常,因此也就这么的平庸.”而天才总是与众不同的,所以当邪狼问修罗王:“老大,你蹲在那儿一动不动看了有半个小时了,蚂蚁有那么好看吗?” 修 ...

  3. 递归打印lua中的table

    在lua中,table是比较常用的数据形式,有时候为了打印出里面的内容,需要做一些特殊处理. 废话不多讲,直接粘代码: print = release_print -- 递归打印table local ...

  4. 面试 15:顺时针从外往里打印数字(剑指 Offer 第 20 题)

    面试 15:顺时针从外往里打印数字 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字.例如输入: {{1,2,3}, {4,5,6}, {7,8,9}} 则依次打印数字为 1.2.3. ...

  5. UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)

    题目描写叙述: 定义合法的括号序列例如以下: 1 空序列是一个合法的序列 2 假设S是合法的序列.则(S)和[S]也是合法的序列 3 假设A和B是合法的序列.则AB也是合法的序列 比如:以下的都是合法 ...

  6. 使用递归打印二叉树的左视图 java

    使用递归打印二叉树的左视图 java package com.li.jinRiTouTiao; public class PrintLeftView { static class TreeNode{ ...

  7. DP(递归打印路径) UVA 662 Fast Food

    题目传送门 题意:n个饭店在一条直线上,给了它们的坐标,现在要建造m个停车场,饭店没有停车场的要到最近的停车场,问所有饭店到停车场的最短距离 分析:易得区间(i, j)的最短距离和一定是建在(i + ...

  8. Shell脚本递归打印指定文件夹中全部文件夹文件

    #!/bin/bash #递归打印当前文件夹下的全部文件夹文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$li ...

  9. Java n个线程轮流打印数字的问题

    一. 实现两个线程.轮流打印出数字.例如以下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread ...

随机推荐

  1. MemProof教程

    简介 MemProof(内存清道夫)是AutomatedQA出品的一款非常不错的检测内存泄漏和资源泄漏的免费调试工具,适合于WIN32平台下使用DELPHI/C++ BUILDER开发的应用程序. 利 ...

  2. Oracle 动态视图4 V$SESSION_WAIT & V$SESSION_EVENT

    一.视图V$SESSION_WAIT显示了session的当前等待事 Column Datatype Description SID NUMBER Session identifier SEQ# NU ...

  3. 1093. Count PAT's (25)

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  4. hdu 5769 Substring 后缀数组 + KMP

    http://acm.hdu.edu.cn/showproblem.php?pid=5769 题意:在S串中找出X串出现的不同子串的数目? 其中1 <= |S| < $10^5$ 官方题解 ...

  5. linux c 验证登录密码

    #define _XOPEN_SOURCE #include <stdio.h> #include <unistd.h> int main(int argc, char *ar ...

  6. libcurl安装

    sudo apt-get install libcurl4-openssl-dev -lcurl

  7. 34 个使用 Raspberry Pi 的酷创意

    如果你手头有一个 Raspberry Pi(树莓派),你会拿它来做什么?或许以下 34 个如何使用 Raspberry Pi 的创意能够给你带来一些启发. Web 服务器 家庭自动化 BitTorre ...

  8. 帝国cms刷洗内容页提示.phome_ecms_news_data_' doesn't exist

    帝国cms后台刷新提示.phome_ecms_news_data_' doesn't exist解决方法: 刷新所有信息内容页面时提示“Table '*.phome_ecms_article_data ...

  9. ZOJ 2314 带上下界的可行流

    对于无源汇问题,方法有两种. 1 从边的角度来处理. 新建超级源汇, 对于每一条有下界的边,x->y, 建立有向边 超级源->y ,容量为x->y下界,建立有向边 x-> 超级 ...

  10. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...