ARTS-1-算法练习-跳台阶

简介: ARTS-1-算法练习-跳台阶

Review



stackoverflow.com/questions/3…


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


Tip


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


排序总结  mp.weixin.qq.com/s/TKhxFb2ps…

bitmap位图算法学习 mp.weixin.qq.com/s/qjC6ZQd8X…

MySQL数据优化实战 mp.weixin.qq.com/s/rJMZq2tP3…


Share



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


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);
 }


目录
相关文章
|
8月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
8月前
|
并行计算 算法 测试技术
模拟算法题练习(一)(扫雷,灌溉,回文日期)
模拟算法题练习(一)(扫雷,灌溉,回文日期)
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
算法练习Day55|● 392.判断子序列 ● 115.不同的子序列
|
3月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
128 0
|
8月前
|
算法 图形学
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
【头歌 计算机图形学 练习】多边形填充v1.0 (第1关:扫描线填充算法(活动边表AET法) 第2关:边缘填充法 第3关:区域四连通种子填充算法 第4关:区域扫描线种子填充算法)
439 0
|
算法 前端开发
算法练习--深拷贝与浅拷贝
深拷贝与浅拷贝
77 0
|
8月前
|
存储 算法 搜索推荐
Leetcode算法题练习(一)
Leetcode算法题练习(一)
92 0
|
算法 Java
Java之包装类的算法小题的练习
Java之包装类的算法小题的练习
81 0

热门文章

最新文章