刷题笔记【3】| 快速刷完67道剑指offer(Java版)

在这里插入图片描述

本文已收录于专栏
《刷题笔记》

文章目录

  • 前言
  • 1、斐波那契数列
    • 题目描述
    • 思路一(递归)
    • 思路二(循环)
  • 2、跳台阶
    • 题目描述
    • 思路一(递归)
    • 思路二(循环)
  • 3、跳台阶扩展问题
    • 题目描述
    • 思路
  • 4、矩形覆盖
    • 题目描述
    • 思路一(递归)
    • 思路二(循环)
  • 5、二进制中1的个数
    • 题目描述
    • 思路一(循环按位比较法)
    • 思路二(位运算优化法)

前言

hi~ ,我是刹那芳间,本专栏题目来源参考阿秀学长的刷题笔记,小戴只是把 C++的题解改成了 Java版本,并整理了其他思路,便于自己的学习~

如果解题有更好的方法,本文也会及时进行更新~

希望对你有帮助~ 一起加油哇~

1、斐波那契数列

牛客原题链接

题目描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项

思路一(递归)

public class Solution {
    public int Fibonacci(int n) {
        if(n==1 || n==2) return 1;
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
}

思路二(循环)

三个元素来保存元素,来回替换即可

public class Solution {
    public int Fibonacci(int n) {
        if(n==1 || n==2) return 1;
        int first = 1,second = 1,third = 0;
        for(int i=2; i<n; i++){
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }
}

2、跳台阶

牛客原题链接

题目描述

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

思路一(递归)

public class Solution {
    public int jumpFloor(int target) {
        if(target==1 || target==2) return target;
        return jumpFloor(target-1) + jumpFloor(target-2);
    }
}

思路二(循环)

public class Solution {
    public int jumpFloor(int target) {
        if (target<=2) return target;
        int first = 1, second = 2, third = 0;
        for (int i = 2; i < target; i++) {
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }
}

3、跳台阶扩展问题

牛客原题链接

题目描述

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

思路

对于 n级台阶,第一步可以有n种跳法:跳1级、跳2级、到跳n级

跳1级,剩下n-1级,则剩下跳法是f(n-1)

跳2级,剩下n-2级,则剩下跳法是f(n-2)

所以f(n)=f(n-1)+f(n-2)+…+f(1),因为f(n-1)=f(n-2)+f(n-3)+…+f(1)
所以f(n)=2*f(n-1)

public class Solution {
    public int jumpFloorII(int target) {
        if(target==1) return 1;
        return 2*jumpFloorII(target-1);
    }
}

4、矩形覆盖

牛客原题链接

题目描述

我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2*n 的大矩形,从同一个方向看总共有多少种不同的方法?

思路一(递归)

public class Solution {
    public int rectCover(int target) {
        if(target <= 2) return target;
        return rectCover(target-1) + rectCover(target-2);
    }
}

思路二(循环)

public class Solution {
    public int rectCover(int target) {
        if (target <= 2) return target;
        int first = 1, second = 2, third = 0;
        for (int i = 2; i < target; i++) {
            third = first + second;
            first = second;
            second = third;
        }
        return third;
    }
}

5、二进制中1的个数

牛客原题链接

题目描述

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示

思路一(循环按位比较法)

& 是位与运算符,同1才为1,否则为0

将移位后的1与数字进行位与运算,结果为1就记录一次

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        for(int i=0; i<32; i++){
            if((n & (1<<i)) != 0){
                count++;
            }
        }
        return count;
    }
}

思路二(位运算优化法)

有一个性质:n&(n−1),会将n的二进制中最低位由1变成0

我们可以不断让当前的 n与 n−1做位与运算,直到 n的二进制全部变为 0 停止,每一次运算,计数一次

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n!=0){
            n = n & (n-1);
            count++;
        }
        return count;
    }
}

你可能感兴趣的:(java,leetcode,算法)