牛客网刷题-05

一:变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

迭代

public class Solution {
    public int JumpFloorII(int target) {
        if (target <= 0) {
            return -1;
        } else if (target == 1) {
            return 1;
        } else {
            return 2 * JumpFloorII(target - 1);
        }
    }

}

二、矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

用归纳法归纳如下,
(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。

(3)当 n = 2时,存在两种情况。

(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。

… 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。
可以明确,n 时必定有 n-1时原来方式与21的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。
(4)如果我们现在归纳 n = 4,应该是什么形式?
4.1)保持原来n = 3时内容,并扩展一个 2
1 方块,形式分别为 “| | | |”、“= | |”、“| = |”
4.2)新增加的21 方块与临近的21方块组成 22结构,然后可以变形成 “=”。于是 n = 4在原来n = 3基础上增加了"| | ="、“= =”。
再自己看看这多出来的两种形式,是不是只比n = 2多了“=”。其实这就是关键点所在…因为,只要2
1或12有相同的两个时,就会组成22形式,于是就又可以变形了。
所以,自然而然可以得出规律: f(n) = f(n-1) + f(n-2), (n > 2)。

如果看了这一套理论还存在疑惑。可以尝试将题目改成13方块覆盖3n、14方块覆盖4n。
相应的结论应该是:
(1)1 * 3方块 覆 盖3n区域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 4 方块 覆 盖4n区域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的结论,如果用1
m的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。

public class Solution {
    public int RectCover(int target) {
        if(target<=0){
            return 0;
        }
        if(target==1||target==2){
            return target;
        }
        int[] rects=new int[target+1];
        rects[0]=1;
        rects[1]=1;
        for(int i = 2;i<target+1;i++){
            rects[i]=rects[i-1]+rects[i-2];
        }
        return rects[target];
    }
}

三、二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

toBinaryString()

public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
如果参数为负,该无符号整数值为参数加上 232;否则等于该参数。
将该值转换为二进制(基数 2)形式的无前导 0 的 ASCII 数字字符串。
如果无符号数的大小为零,则用一个零字符 ‘0’ (’\u0030’) 表示它;
否则,无符号数大小的表示形式中的第一个字符将不是零字符。字符 ‘0’ (’\u0030’) 和 ‘1’ (’\u0031’) 被用作二进制数字。

toCharArray()

toCharArray() 方法将字符串转换为字符数组。
语法 public char[] toCharArray()
参数 :无
返回值 :字符数组。

public class Solution {
    public int NumberOf1(int n) {
        int t=0;
            char[]ch=Integer.toBinaryString(n).toCharArray();
            for(int i=0;i<ch.length;i++){
                if(ch[i]=='1'){
                    t++;
                }
            }
            return t;
    }
}

猜你喜欢

转载自blog.csdn.net/Pandora_417/article/details/90384320