zoukankan      html  css  js  c++  java
  • ARTS习惯(7)

    Algorithm

    每周至少做一个Leetcode算法题

    第1道


    【题目来源】

    T9:斐波那契数列,何海涛《剑指Offer》

    【题目】

    写一个函数,输入参数n,输出斐波那契数列的第n项

    例子

    # 斐波那契数列从第0开始
        0 1 1 2 3 5 8 13
    

    【解答】

    • 解法1:递归解法,容易理解,但效率太差,不予详细分析

    • 解法2:动态规划法(推荐)

      斐波那契的递推关系,也是DP的状态转移方程

    • 解法3:乘方法,f(n)=M^n

      [M = left[ egin{matrix} 1 & 1\1 & 0end{matrix} ight] ]

      /**
           * 解法2:动态规划,从底往上计算,避免重复计算
           *  例子:f(0)+f(1)-> f(2)
           *       f(1)+f(2)-> f(3)
           *       ...
           		 PreTwo+Preone-> cur
           *
           * @param n
           * @return
           */
          public int FibonacciByOrder(int n) {
              if (n < 2) {
                  return n;
              }
              int PrevOne = 1;
              int PrevTwo = 0;
              int cur = 0;
              for (int i = 2; i <= n; i++) {
                  cur = PrevOne + PrevTwo;
                  PrevTwo = PrevOne;
                  PrevOne = cur;
              }
              return cur;
          }
      

    思考

    • 改编题1:一只青蛙一次可以跳上1 级台阶,也可以跳上2 级。求该青蛙跳上一个n级的台阶总共有多少种跳法
    • 改编题2:在青蛙跳台阶的问题中,如果把条件改成:一只青蛙一次可以跳上 1级台阶,也可以跳上 2 级……它也可以跳上 n 级,此时该青蛙跳上一个 n级的台阶总共有多少种跳法?我们用数学归纳法可以证明f(n)=2^n-1。

    第2道


    【题目来源】

    T11:数值的整数次方,何海涛《剑指Offer》

    【题目】

    实现函数 double Power(double base, int exponent),求 base 的exponent次方。不得使用库函数,同时不需要考虑大数问题。

    例子

    // power(2,2)
    4
    // power(2,-2)
    0.25
    

    【解答】

    • 解法1:循环法记录底数相乘的次数,很显然根据次方exp(幂)的定义:就是exp个base连续相乘。

      这是所有人下意识都能想到的解法,不能体现算法训练的价值,这里不细分析,提醒注意:(1)底数为0的负整数次方,如0^-2,(2)指数exp除了正整数外为负数和零的情形

    • 解法2:二分法。二分法的本质是每次排除一半,那么是否可以根据公式1利用二分法写出O(logN)的解法呢,答案是当然可以。我们可以利用递归将指数n-> n/2-> n/4->...1逐步二分掉,直到满足基准条件

      [a^0 = 1,a^1=a ]



    [ a^n = egin{cases} a^frac{n}{2}a^frac{n}{2} & n为偶数 \ a^frac{n-1}{2}a^frac{n-1}{2}a &n为奇数 end{cases} ]

    公式1

    根据以上的分析,给出参考代码

     public double myPow(double base, long exp) {
            // 排除除0的异常
            if (base ==0 && exp < 0) {
                return 0;
            }
            if (exp == 0) {
                return 1;
            }
            if (exp == 1) {
                return base;
            }
            // 处理负指数幂
            if (exp < 0) {
                exp = -exp;
                base = 1 /base;
            }
            double result = myPow(base, exp>>1);
            result *= result;
            if ( exp%2 == 1 ) {
                result *= base;
            }
            return result;
        }
    

    值得注意的是

    int exp = [−2^31, 2^31 − 1],左边界取反会出现越界的错误,因此定义exp为long
    

    思考

    Review

    阅读并点评至少1篇英文技术文章

    【原文】:CH17.Release Your Code From Kathy Sierra's Head first Java author

    【译文】:

    【点评】:

    部署:指的是将程序员写的Java源代码经过处理加工成jar文件的过程,可以供其他人运行和充当轮子。

    处理过程可以分为:编译、打包

    JAR is Java ARchive(Java归档),这是一种基于pkzip的文件格式,对于终端使用者来说,操作的是1个.jar文件,而不是成百上千的.class文件。

    • Deploying your application

      • 本地:可执行的JAR文件
      • 混合
      • 远程
    • Separate source code and class files

      • sources目录:存放源代码
      • classes目录:存放字节码文件
    • Put your Java in a JAR

      • 如何生成.jar
        1. cd MyProject/classes
        2. jar -cvmf manifest.txt packFoof.jar javaranch
    • Running (executing) the JAR

      • 执行jar
        1. cd MyProject/classes
        2. java -jar packFoof.jar
    • Put your classes in packages

      • 为什么要创建包?

        • 数一下有多少个List

        • 保证class文件的唯一性,不要同名

          举例:叫孙少安的人很多,那怎么区分呢?最简单的就是根据户口,也就是你是xx省xx市xx县xx镇xx村的孙少安,我是另外一个村的孙少安也就可以区分了

      • 怎么避免包名冲突,保证包的唯一性

        • 域名反写

        sun官方给的命名规范建议是:反写的域名,借助域名唯一的特点来保证包不同名。例如:com.alibaba、org.apache

    • META-INF目录

      • MANIFEST.MF文件

        指定jar包的main()方法的位置

    • jar管理工具

      • Maven

    Tip

    学习至少一个技术技巧

    总结的高频快捷键速查清单,全部经过测试,不灌水

    Share

    分享一篇有观点和思考的技术文章

    ES官方的教程,轻巧结构清晰,Elasticsearch: 权威指南

    米罗说

    • 人生不在于做多少事,在于把关键的事做到极致。

    移动端更方便随时阅读,下面是作者的微信公号,觉得作者的文章对你有帮助,可以关注支持一下。

  • 相关阅读:
    POJ——3070Fibonacci(矩阵快速幂)
    NOJ——1568走走走走走啊走(超级入门DP)
    NOJ——1624死胡同(胡搞模拟)
    jmeter断言
    jmeter问题
    廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配
    廖雪峰Java9正则表达式-1正则表达式入门-2正则表达式匹配规则
    廖雪峰Java9正则表达式-1正则表达式入门-1正则表达式简介
    使用uiautomator2进行webview页面的测试
    廖雪峰Java8JUnit单元测试-2使用JUnit-4超时测试
  • 原文地址:https://www.cnblogs.com/PengLuo22/p/14236654.html
Copyright © 2011-2022 走看看