hi~ ,我是刹那芳间,本专栏题目来源参考阿秀学长的刷题笔记,小戴只是把 C++的题解改成了 Java版本,并整理了其他思路,便于自己的学习~
如果解题有更好的方法,本文也会及时进行更新~
希望对你有帮助~ 一起加油哇~
牛客原题链接
大家都知道斐波那契数列,现在要求输入一个正整数 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;
}
}
牛客原题链接
一只青蛙一次可以跳上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;
}
}
牛客原题链接
一只青蛙一次可以跳上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);
}
}
牛客原题链接
我们可以用 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;
}
}
牛客原题链接
输入一个整数 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;
}
}