首页 > 编程语言 >java面试题,上楼梯有多少种方式

java面试题,上楼梯有多少种方式

时间:2022-11-28 17:35:02浏览次数:42  
标签:map 面试题 java int countWaysDP return static 楼梯 public

 

java面试题,上楼梯有多少种方式

题目:一个小孩上一个N级台阶的楼梯,他可以一次走1阶、2阶或3阶,那么走完N阶有多少种方式。

很自然的想法是使用递归:

public class Test04 {

public static int countWays(int n) {
if(n < 0) {
return 0;
}
else if(n == 0) {
return 1;
}
else {
return countWays(n - 1) + countWays(n - 2) + countWays(n - 3);
}
}

public static void main(String[] args) {
System.out.println(countWays(5)); // 13
// 11111, 1112, 1121, 1211, 122, 131, 113, 23, 221, 2111, 212, 32, 311
}
}

然而,这里的递归是一个头递归,也就是说要先递归再回溯(编译器无法将其优化为一个循环结构),而且是将三个递归的结果进行合并,这样的话算法的运行时间呈指数增长(渐近时间复杂度为O(3^N))。可以利用动态规划的思想对递归进行优化,其代码如下所示:
public class Test04 {

public static int countWaysDP(int n) {
int[] map = new int[n + 1];
for (int i = 0; i < map.length; i++) {
map[i] = -1;
}
return countWaysDP(n, map);
}

private static int countWaysDP(int n, int[] map) {
if (n < 0) {
return 0;
}
else if (n == 0) {
return 1;
}
else if (map[n] > -1) {
return map[n];
}
else {
map[n] = countWaysDP(n - 1, map) + countWaysDP(n - 2, map)
+ countWaysDP(n - 3, map);
return map[n];
}
}

public static void main(String[] args) {
System.out.println(countWaysDP(5)); // 13
// 11111, 1112, 1121, 1211, 122, 131, 113, 23, 221, 2111, 212, 32, 311
}

}
 

标签:map,面试题,java,int,countWaysDP,return,static,楼梯,public
From: https://www.cnblogs.com/biubiu111/p/16932799.html

相关文章

  • java程序员计算机网络面试题大全含答案
    java程序员计算机网络面试题大全含答案java程序员计算机网络面试题大全含答案GET请求请注意,查询字符串(名称/值对)是在GET请求的URL中发送的:/test/demo_form?name1=val......
  • BMP 图像文件解析及直方图均衡化算法(Java)
    BMP图像解析,基本照抄关于Java读取和编写BMP文件的总结直方图均衡化没抄着,自己写了一个。代码结构:GUI:JavaSwing实现importUtils.BMPImage;importUtils.GraphUti......
  • Java多线程经典概念题
    Java多线程经典概念题1.并行和并发有什么区别?并发(concurrency)和并行(parallellism)是:解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间......
  • Java多线程经典编程题
    Java多线程经典编程题1.要求线程a执行完才开始线程b,线程b执行完才开始线程packagecom.example.javatest.theardTest.MultiThreadAlgorithm;/**要求线程a执行完才......
  • Java实现递归查询树结构
        我们在实际开发中,肯定会用到树结构,如部门树、菜单树等等。Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示。今天,咱们就来说......
  • JAVA-API概述-Scanner类键盘录入数据
    代码一packagecom.itheima.api;importjava.util.Scanner;publicclassDemo1Scanner{/*next():遇到了空格,就不再录入数据了结......
  • 小新学Java13-【线程池、Lambda表达式】
    一、等待唤醒机制1.1线程间通信概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。1.2等待唤醒机制什么是等待唤醒机制?这是多个线程间的一种协作机......
  • Java基础运算符
    JAVA基础运算符算数运算符:+,-,*,/,%,++,--//二元运算符//Ctrl+D赋值当前行到下一行inta=10;intb=20;intc=25;......
  • Java中数组、集合初始化及遍历方式
    一、数组1.一维数组一维数组两种初始化方式静态初始化int[]array={1,2,3};int[]array=newint[]{1,2,3};动态初始化int[]array=newint[3......
  • Java语言程序设计第六讲,流与文件
    这次知识点总结拖了好久QWQ因为没有找到相关文件(.java文件之类的资料),这次的总结会比之前的简略很多 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数......