本人比较注重本题的效率问题,如果谁有可以改进的方法,希望大家能互相学习一下。
题目:一个人能台阶,一次能登一级、二级或者三级台阶,假设有n级的台阶,请编写一个java的程序将各种的走法打印出来。
/*
* 总结:递归是解决一个问题的很好的方法,使问题的解决简单化,但是递归往往比较吃内存,当可以使用非递归的方式可以解决问题的时候,请
* 优先考虑非递归的方法;
* 以下的这个类只要添加一个main()方法就可以运行了,不过由于是用递归的,台阶大的话(最大只能是22),会发生内存的溢出,谁有更好的方法,希望能互相交流一下
*/
import java.util.ArrayList;
import java.util.List;
public class WalkStep2 {
private String excTime;
//保存结果的List
private List<List<Integer>> result=new ArrayList<List<Integer>>();
public WalkStep2(int leftStep){
long start=System.currentTimeMillis();
this.walkStep(new Node(leftStep));
long end=System.currentTimeMillis();
this.setExcTime((end-start)+" 毫秒(ms)");
}
public WalkStep2(){
this.walkStep(new Node(10));
}
public void add(List<Integer> aresult){
result.add(aresult);
}
public long getResultCount() {
return result.size();
}
public List<List<Integer>> getResult() {
return result;
}
public void setResult(List<List<Integer>> result) {
this.result = result;
}
public String getExcTime() {
return excTime;
}
public void setExcTime(String excTime) {
this.excTime = excTime;
}
//该类是一个节点的类
class Node{
private int leftStep;
private Node parent;
public Node(){}
public Node(int leftStep){
this.leftStep=leftStep;
}
public int getLeftStep() {
return leftStep;
}
public void setLeftStep(int leftStep) {
this.leftStep = leftStep;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
}
public void walkStep(Node aNode){
//当剩余的台阶数为0的时候,就得到一种走法
if(aNode.getLeftStep()==0){
addKindOfResultToList(aNode);
}
walk(aNode);
}
//走台阶
private void walk(Node aNode) {
//只走一步的走法
if(aNode.getLeftStep()-1>=0) aWalk(aNode,1);
//只走两步的走法
if(aNode.getLeftStep()-2>=0) aWalk(aNode,2);
//只走三步的走法
if(aNode.getLeftStep()-3>=0) aWalk(aNode,3);
}
//将结果加到List链表中
private void addKindOfResultToList(Node aNode) {
List<Integer> list=new ArrayList<Integer>();
Node resultNode=aNode;
while( resultNode.getParent()!=null){
list.add(0,resultNode.getParent().getLeftStep()-resultNode.getLeftStep() );
resultNode=resultNode.getParent();
}
this.result.add(list);
}
//走下一步的方法
private void aWalk(Node aNode,int step) {
Node stepNode=new Node(aNode.getLeftStep()-step);
stepNode.setParent(aNode);
walkStep(stepNode);
}
}
分享到:
相关推荐
**题目描述:** 设计一个类`Foo`,其中包含一个构造函数`Foo(const char*str)`,该构造函数的功能是判断字符串`str`是否完全由`abc`组成的所有排列构成。 **知识点详解:** - **基本思路:** - 创建一个`Foo`类,...
8. 问题解决能力与逻辑思维:这部分通常以开放性问题出现,例如设计一个简单的系统或解决一个特定的技术问题,考察应聘者的思路清晰程度和创新能力。 9. 项目经验与实战能力:尽管是笔试题,但面试官可能期望看到...
题目中提出了一个问题:如何使得90%的查询能在100毫秒内返回结果。这需要从数据库架构、查询优化、索引策略等多方面进行考虑: - **数据库分片**:对大数据量的数据库进行分片,分散查询压力。 - **读写分离**:将...
这份“迅雷笔试题汇总整理”涵盖了多种IT领域的知识,旨在测试应聘者的综合素质和技术能力。以下是对这些知识点的详细解析: 1. **计算机网络**:迅雷的核心业务涉及网络传输,因此,网络基础知识是必不可少的,...
这篇资料主要包含了一些迅雷笔试题目的具体内容,涵盖了算法、智力和逻辑推理等多个方面的问题。以下是对这些题目涉及的知识点的详细解释: 1. **循环左移函数**:这是一个简单的字符串处理函数,它将字符串中的...
迅雷作为知名的互联网技术公司,其校园招聘笔试题往往涵盖了计算机科学和技术的多个核心领域,旨在测试应聘者的编程能力、算法基础、系统设计以及问题解决技巧。以下将详细解析这两个时期的笔试题可能涉及的知识点:...
【迅雷C++笔试面试题】是针对求职者在应聘迅雷公司相关职位时可能会遇到的测试题目,这些题目通常涵盖了C++编程语言的核心概念、语法特性、数据结构、算法以及面向对象编程等方面的知识。在准备这样的面试时,考生...
以下是可能在迅雷笔试中出现的C++知识点: 1. **基本语法**:包括变量声明、数据类型(如int、float、char等)、运算符优先级、流程控制语句(如if、for、while)等。 2. **函数**:理解函数的作用、参数传递(值...
【2014迅雷校园招聘笔试题】中涉及的IT知识点主要集中在C++编程语言、数据结构与算法、编译原理以及网络协议等方面。以下是对这些知识点的详细解释: 1. **指针与内存管理**: - 单选题第2题提到,32位地址的指针...
【编程题】涉及的知识点包括Java并发编程和数据处理: 1. **Java阻塞队列BlockQueue**:需要实现一个队列,当队列满时,插入操作会阻塞,直到有空间可用。当队列空时,取出操作也会阻塞,直到有元素可取。这是Java...
在本题目中,我们主要关注两个编程问题,一个是关于输出特定字符形成的金字塔图案,另一个是C++中的对象构造与析构以及全排列的实现。 首先,让我们看第一个问题,生成金字塔图案的C++代码。该代码接收用户输入的一...
而笔试题则可能包含编程题、逻辑推理题和数学问题,旨在测试候选人的创新思维和实际操作能力。 百度作为中国最大的搜索引擎公司,其面试笔试同样重视技术深度和广度。可能会考察你对搜索引擎原理的理解,比如网页...
这篇内容主要涉及了迅雷公司的一份笔试题,包含了数据库管理、SQL语言、软件测试理论、操作系统、网络协议以及TCP/IP协议模型等多个IT领域的知识点。 首先,从选择题部分我们学习到: 1. 数据库结构的描述和定义...
- **360**:360公司关注网络安全和反病毒技术,笔试题可能包含安全攻防、恶意代码分析、网络协议解析等,同时会考察编程和算法能力。 - **网易**:网易笔试题可能涵盖游戏开发、音乐/视频流媒体处理、前端框架应用...
首先,迅雷笔试题中包含了多道编程和算法相关的面试题目,这里着重解析两个较为复杂的编程题目: 1. 如何将90%的查询在100毫秒内完成? 这是一个典型的性能优化问题。对于数据库查询,通常有以下几种优化手段: -...
这个列表表明,压缩包内可能包含的是迅雷笔试题目集,可能分为多个部分,涵盖以上提到的各种知识点。通过深入研究这些题目,不仅可以检验自己的技术水平,还能发现自身的薄弱环节,进行针对性的复习和提升。 总之,...
"迅雷和其他公司的一些笔试题"这个标题揭示了这是一份包含多个公司的笔试题目集合,其中可能包括迅雷公司以及其他未知的IT企业。这些题目主要用于考察应聘者的C/C++编程能力,可能涉及到语言基础、数据结构、算法、...
### 迅雷2010笔试题解析 #### 题目一:指针与数组的理解 **题目描述**: ``` int (*p)[3] p的含义是什么? ``` **解析**: 此题考察了指针与数组的结合使用。`int (*p)[3]` 是一个指向含有3个整型元素的数组的指针...
根据提供的压缩包文件名称,我们可以推测这是一套包含四部分的笔试题集,每部分可能代表一个或多个问题,以图片形式存在。以下是可能涉及的一些C++知识点: 1. **基础语法**:C++的基础知识包括变量定义、数据类型...
3. **XML处理**:XML是一种重要的数据交换格式,相关笔试题可能涵盖XML的解析、DOM和SAX模型、DTD或XSD约束等。 4. **网络与系统运维**:例如百度的运维部门笔试题,可能会测试应聘者的Linux系统管理、网络协议、...