爬楼梯 java_爬楼梯问题java实现
问题:
从楼上走到楼下有n个台阶,每一步有3中走法:走1个台阶,走2个台阶,走3个台阶。
如:
当有1个台阶时,有1种走法
当有2个台阶时,有2种走法
当有3个台阶时,有4钟走法
求:
当有4个台阶时,有几种走法?
当有5个台阶时,有几种走法?
当有100个台阶时,有几种走法?
请设计程序计算,对于给定的n个台阶,有几种走法?
解答思路
1.想到类似斐波那契数列算法,得出F(n)=F(n-1)+F(n-2)+F(n-3),采用递归的办法实现,如下面calucate1方法可实现。
但有个问题是随着楼梯台阶增多,计算量会成指数增长,时间复杂度会大大增加。
2.采用excel计算的思路,在excel中,重上往下先定义4个值,如
a1=1,a2=2,a3=4,a4=7,选中a2,a3,a4,采用公式F(n)=F(n-1)+F(n-2)+F(n-3)的形式,计算a5到a100的值
如下面calucate2方法可实现。
这样实现不太好,数组有可能太长
3.采用定长数组,循环替换的方式,参考calucate3方法可实现。
还有一个问题,当n=100时,数值会很大,在java中涉及到大数计算
4.采用BigInteger,参考calucate4方法可实现。
备注:
先分享我对这个问题的思考,抛砖引玉,欢迎大家讨论,里面还有什么问题,还可以怎么优化
import java.math.BigInteger;
public class Stair {
public static int calucate1(int i){
if(i<=0){
return 0;
}
switch (i){
case 1:
return 1;
case 2:
return 2;
case 3:
return 4;
default:
return calucate1(i-1)+calucate1(i-2)+calucate1(i-3);
}
}
public static int calucate2(int i){
if(i<=0){
return 0;
}
switch (i){
//第1个台阶
case 1:
return 1;
//第2个台阶
case 2:
return 2;
//第3个台阶
case 3:
return 4;
//第i个台阶
default:
int[] data=new int[i];
data[0]=1;
data[1]=2;
data[2]=4;
for(int j=4;j<=i;j++){
//计算第j个台阶时有多少种走法
data[j-1]=data[j-2]+data[j-3]+data[j-4];
}
//返回第i个台阶时有多少种走法
return data[i-1];
}
}
public static int calucate3(int i){
if(i<=0){
return 0;
}
switch (i){
//第1个台阶
case 1:
return 1;
//第2个台阶
case 2:
return 2;
//第3个台阶
case 3:
return 4;
//第i个台阶
default:
//初始化第一个,第二个,第三个台阶时的走法
int[] data={1,2,4};
for(int j=4;j<=i;j++){
//定义数组下标值
int index= (j-1)%3;
//计算数值
int temp=data[0]+data[1]+data[2];
//替换目标下标值所在位置的数值
data[index]=temp;
}
return data[(i-1)%3];
}
}
public static BigInteger calucate4(int i){
if(i<=0){
return new BigInteger("0");
}
switch (i){
//第1个台阶
case 1:
return new BigInteger("1");
//第2个台阶
case 2:
return new BigInteger("2");
//第3个台阶
case 3:
return new BigInteger("4");
//第i个台阶
default:
//初始化第一个,第二个,第三个台阶时的走法
BigInteger[] data={new BigInteger("1"),new BigInteger("2"),new BigInteger("4")};
for(int j=4;j<=i;j++){
//定义数组下标值
int index= (j-1)%3;
//计算数值
BigInteger temp=data[0].add(data[1]).add(data[2]);
//替换目标下标值所在位置的数值
data[index]=temp;
}
return data[(i-1)%3];
}
}
public static void main(String[] args) {
System.out.println("---------------------1------------------------");
//采用递归的思路
System.out.println(calucate1(4)); //7
System.out.println(calucate1(5)); //13
System.out.println(calucate1(19)); //66012
// System.out.println(calucate1(100)); //递归层级计算次数太多,代码执行起来时间复杂度巨大
System.out.println("---------------------2------------------------");
//excel从上往下拖动的思路
System.out.println(calucate2(4)); //7
System.out.println(calucate2(5)); //13
System.out.println(calucate2(19)); //66012
System.out.println(calucate2(100)); //随着台阶数量增长,数组长度也增长,浪费空间
System.out.println("---------------------3------------------------");
//采用数组值交替计算的思路
System.out.println(calucate3(4)); //7
System.out.println(calucate3(5)); //13
System.out.println(calucate3(19)); //66012
System.out.println(calucate3(100)); //可以计算值
//解决大数值计算的问题
System.out.println("---------------------4------------------------");
System.out.println(calucate4(4)); //7
System.out.println(calucate4(5)); //13
System.out.println(calucate4(11)); //66012
System.out.println(calucate4(1000)); //可以计算值
}
}
爬楼梯 java_爬楼梯问题java实现相关推荐
- 程序设计爬楼梯问题_楼梯案例:解决楼梯问题的C ++程序
程序设计爬楼梯问题 A child is running up a staircase with N steps, and can hop 1 step, 2 steps or 3 steps at ...
- 爬楼梯和爬楼梯进阶c++
该题是动态规划入门题,可扩展性较强.主要思想参考代码随想录 文章目录 题目分析 题目描述 题目分析 实践步骤 代码实现 总结: 复杂度 知识考察 题目分析 题目描述 基础爬楼梯,每次以1或2步爬楼梯, ...
- Python3.x爬虫教程:爬网页、爬图片、自己主动登录
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自己主动登录.并对HTTP协议做了一个简单 ...
- Python3.x爬虫教程:爬网页、爬图片、自动登录
林炳文Evankaka原创作品.转载请注明出处 http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自动登录.并对HTTP协议做了一个简单的介 ...
- 2 爬虫 数据解析(bs4,XPath) robots协议 cookie反爬 代理反爬
爬虫 1 数据解析 1.1 介绍 1.1.1 概念即作用 数据解析就是将一组数据中的局部数据进行提取,用于实现聚焦爬虫. 聚焦爬虫是建立在通用爬虫的基础上,从通用爬虫获取的整个源码数据中提取出指定的数 ...
- 爬了个爬(一)爬虫入门
一.爬虫定义 网络爬虫:(又被称为网页蜘蛛,网络机器人,在FOFA社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. URI(Uniform Resourc ...
- python小明爬楼梯_爬楼梯(Python and C++解法)
题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数.
- 【动态规划】爬楼梯爬的不仅仅是楼梯
深度思考爬楼梯问题,抽取一般过程,目标是对其变式题也能认出并且求解 一.题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? ...
- python爬楼梯_Python3爬楼梯算法示例
Python3爬楼梯算法示例 本文实例讲述了Python3爬楼梯算法.分享给大家供大家参考,具体如下: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同 ...
- 蚂蚁爬绳java_腾讯面试题——蚂蚁爬行(Java版)
/** * 蚂蚁类,用于记录蚂蚁的状态及控制蚂蚁行为 */ public class Ant { /** * 蚂蚁爬行方向枚举值 */ public interface Direction { /** ...
最新文章
- 从指南针到北斗:中国导航系统促进世界互联互通
- php 析构不执行,PHP析构方法 __destruct() 不触发的两个解决办法
- 树莓派教程之树莓派系统镜像刷入和远程登陆(1)
- mysql的配置和启动命令
- 华为,15万大军孤独行走在世界上
- 《程序员修炼之道》笔记(九)
- WPF入门教程系列十三——依赖属性(三)
- linux如何使用vnc远程登录,如何使用Xmanager及VNC登录远程桌面
- JMF调用摄像头粉屏的问题(win10 64位系统)
- 什么叫诚实_李现自爆平常最爱看小姐姐!IG按赞被抓包 网友赞:诚实
- 【洛谷】【lca+结论】P3398 仓鼠找sugar
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
- linux之grep使用技巧
- docker es持久化_docker如何保持数据持久化?其实可以考虑通过数据卷挂载的方式~...
- 1.2 XML 的基本语法
- gels imagej 图片处理_科研论文作图之ImageJ
- oracle 创建包 def,cognos创建oracle 数据源报错QE-DEF-0285
- 人工智能如何影响5G网络标准?
- 作为初学者,第一次用div+css编写淘宝静态首屏
- JVM jvmpi (转)
热门文章
- 计算机程序停止工作怎么办,如何将“某某程序已正常停止工作,请关闭程序”这个提示自动关闭...
- springcloud学习-Eureka、Eureka高可用集群、Ribbon客户端负载均衡策略
- oracle sequence nextval,SOS!!! Sequence.nextval 的问题
- oracle数据存储层级
- 读书笔记-《墨菲定律》
- 【其他专题】好用的截图(包括动图gif)软件分享
- 如何将手机里的小视频做成GIF动图?一键轻松生成GIF动画
- 中国猫道系统市场趋势报告、技术动态创新及市场预测
- 工期计算机在线,工期日历计算器
- Pycharm修改镜像源并添加信任