2021.01.04 斐波那契数列

今日题目:斐波那契数列,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。
image.png

  • 思路:很明显采用递归调用,递归结束的条件是n=0或n=1;其他情况则继续递归。
  • 缺陷:代码是很简单,但是若递归次数过多即n过大的话,就会出现栈溢出的情况。
  • 自己的菜鸡代码:
    1. class Solution {
    2. public int fib(int n) {
    3. if(n == 0) return 0;
    4. else if(n == 1) return 1;
    5. else return fib(n-1) + fib(n-2);
    6. }
    7. }
    其他人的代码(采用非递归的方式):
    1. class Solution {
    2. public int fib(int n) {
    3. if(n==0) return 0;
    4. if(n==1) return 1;
    5. int p0=0,p1=1,res=0;
    6. for(int i=2;i<=n;i++){
    7. res=p0+p1;
    8. p0=p1;
    9. p1=res;
    10. }
    11. return res;
    12. }
    13. }
    递归(下)与非递归(上)方式的比较:递归中有许多计算是重复的,因此时间开销较大,非递归的方式的运行时间明显较短
    递归调用树如图:

image.png

2021.01.05 斐波那契数列(有点差别)

今日题目:斐波那契数列(有点差别)

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
提示:0 <= n <= 100
image.png

  • 思路:
    1. 法一:采用迭代的方式计算
    2. 法二:看评论区看到了动态规划解决这个问题的方法。(等俺复习了再来补充8 唉)
  • 自己的菜鸡代码:
  1. class Solution {
  2. public int fib(int n) {
  3. // 采用非递归的方式进行,可以省不少时间
  4. if(n == 0) return 0;
  5. if(n == 1) return 1;
  6. int f0 = 0, f1 = 1,temp = 0;
  7. for(int i = 2; i <= n; i++){
  8. temp = (f1 + f0) % 1000000007;
  9. f0 = f1;
  10. f1 = temp;
  11. }
  12. return (int)f1;
  13. }
  14. }

运行结果:
image.png

2021.01.20 求1+2+···+n

今日题目:求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
image.pngimage.png
限制:1 <= n <= 10000

  • 思路:
    1. 法一:感觉这里可以用递归解决。(违规使用 if )
    2. 法二:确实是使用递归,但是没有用到 if 。在没有 if 的情况下要如何终止递归呢?可以利用逻辑符的短路效应。例如: && 只要左边为false,就不会继续判断右边; || 只要右边为true就不会继续判断右边。所以可以利用逻辑符来终止递归。
      • 时间复杂度 O(n) : 计算 n + (n-1) + … + 2 + 1 需要开启 n 个递归函数。
      • 空间复杂度 O(n) : 递归深度达到 n ,系统使用 O(n) 大小的额外空间。
  • 自己的菜鸡代码: ```java // 法一:违规作废 class Solution { public int sumNums(int n) {
    1. if(n == 1) return 1;
    2. return n + sumNums(n - 1);
    } }

// 法二 class Solution { public int sumNums(int n) { boolean x = n > 1 && (n += sumNums(n - 1)) > 0; return n; } }

  1. - 运行结果:
  2. 法一:本来想着可以用递归,结果违规使用了if。<br />法二:利用逻辑符的短路效应。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1584832/1611042049263-266b123b-5fde-41c1-b4f0-d9ddc547e0b0.png#align=left&display=inline&height=239&margin=%5Bobject%20Object%5D&name=image.png&originHeight=477&originWidth=632&size=29106&status=done&style=none&width=316)![image.png](https://cdn.nlark.com/yuque/0/2021/png/1584832/1611108928676-179778a3-1aa3-4008-a57a-1f9b61429672.png#align=left&display=inline&height=227&margin=%5Bobject%20Object%5D&name=image.png&originHeight=454&originWidth=628&size=29406&status=done&style=none&width=314)
  3. <a name="a6t7x"></a>
  4. ### 2021.02.01 数值的整数次方(好气)
  5. 今日题目:实现函数double Power(double base, int exponent),求baseexponent次方。不得使用库函数,同时不需要考虑大数问题。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1584832/1612152449141-9cb97319-38c3-40eb-bb6f-83143d0fa212.png#align=left&display=inline&height=113&margin=%5Bobject%20Object%5D&name=image.png&originHeight=123&originWidth=210&size=3272&status=done&style=none&width=193)![image.png](https://cdn.nlark.com/yuque/0/2021/png/1584832/1612152465411-4c4408b5-e2de-4aad-91aa-48956140a08b.png#align=left&display=inline&height=107&margin=%5Bobject%20Object%5D&name=image.png&originHeight=116&originWidth=204&size=3078&status=done&style=none&width=189)![image.png](https://cdn.nlark.com/yuque/0/2021/png/1584832/1612152478012-e5488143-2227-40a8-b39d-dfce95b5c9e6.png#align=left&display=inline&height=98&margin=%5Bobject%20Object%5D&name=image.png&originHeight=143&originWidth=311&size=4719&status=done&style=none&width=213)<br />**说明:**
  6. - -100.0 < _x_ < 100.0
  7. - _n_ 32 位有符号整数,其数值范围是 [−2, 2 1]
  8. - 思路:
  9. 快速幂:
  10. - 自己的菜鸡代码:
  11. ```java
  12. double result = 1.0;
  13. for (int i = n; i != 0; i /= 2) {
  14. if ((i&1) == 1) {
  15. result *= x;
  16. }
  17. x *= x;
  18. }
  19. if (n < 0) {
  20. result = 1 / result;
  21. }
  22. return result;
  • 运行结果: