博客
关于我
ARTS-1-算法练习-跳台阶
阅读量:348 次
发布时间:2019-03-04

本文共 2241 字,大约阅读时间需要 7 分钟。

概述:

 用户自发每周完成一个ARTS:

1.Algorithm:每周至少做一个 leetcode 的算法题

2.Review:阅读并点评至少一篇英文技术文章

3.Tip:学习至少一个技术技巧

4.Share:分享一篇有观点和思考的技术文章

Review

第一次尝试阅读英文技术文章该文章主要是讲解了对于arraylist和linkedlist的使用观点。虽然翻译过来和自己原先的理解差别并不大,但是却发现外国的程序员对于技术的专研和讨论的热度真的大大超出了我的想象,一个看似简单的问题,竟然最终被网友们讨论地如此热火朝天,也有很多之前没有思考过的观点不断出现。

Tip

都写在了公众号上边进行技术知识的总结

排序总结  

bitmap位图算法学习 

MySQL数据优化实战 

Share

 个人感觉耗子叔写的这篇文章挺适合我这个年龄段的新手区阅读,提早确立目标,更有利于后期的职业发展,同时也让我明白了坚持写文章的意义。

Algorithm

题目概述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

本题目第一次做的时候可能会觉得无从下手,但是通过观察之后会发现,其实这是一道找规律的算法题目。

规律:

台阶数目 跳法
1 1
2 2
3 3
4 5
5 8

一直这么计算下去,不知道你是否有发现,这里面存在一定的规律,满足了F(n)=F(n-1)+F(n-2):(当n>2的时候),正好和斐波列纳数列的规律比较匹配。

所以代码如下所示:(个人不太建议使用递归函数,因为递归当层次加深之后容易发生栈里面的内存空间不足,而且每次进行栈里面的压入数据和弹出数据都需要损耗一定的时间,栈的空间有限,过深的递归会发生栈溢出现象)

private int jumpFloor(int step){        if(step==1){            return 1;        }else if(step==2){            return 2;        }else{            int first=1;            int second=2;            int result=0;            for(int i=3;i==step;i++){                result=first+second;                first=second;                second=result;            }            return result;        }    }

假设我们现在对于题目进行升级改造:

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。:

现在的这种情况下去观察青蛙跳台阶的次数律,依旧会发现这些数字之间存在着一定的规律关系:

台阶数目 跳法
1 1
2 2
3 4
4 8
5 16

 

递归模式:

public int JumpFloor(int target) {            if (target == 0) {                return -1;            } else if (target == 1) {                return 1;            } else {                return 2 * JumpFloor(target - 1);            } }

个人比较不喜欢使用递归的方式来进行编码,容易发生栈溢出。

可以进行代码稍微调整为如下列所示:

// 第一种做法    public static int jumpFloor1(int target) {        if (target == 0) {            return 0;        }        return (int) Math.pow(2, target - 1);    }    //       第二种做法    public static int jumpFloor2(int target) {        if (target == 0){            return 0;        }        if (target == 1) {            return 1;        }        int a = 1;        int b = 2;        for (int i = 2; i == target; i++) {            b = 2 * a;            a = b;        }        return b;    }

但是感觉这样的代码还是过于臃肿了,了解过计算机底层运算原理的朋友应该知道,二进制的位运算实际上就能满足我们的需求。因此最终版代码如下:

public int JumpFloor(int step) {        if(step<=0){            return 0;        }        return 1<<(step-1); }

 

转载地址:http://czte.baihongyu.com/

你可能感兴趣的文章
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>