剑指offer(10-12)题解

10题解–矩阵覆盖

题目描述

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?在这里插入图片描述
比如n=3时,2
3的矩形块有3种覆盖方法

思路解析

这条其实本质上也是一条斐波那契数列数列的变形,注意题目中为什么强调的是2*N的矩阵,就是为了让大家通过斐波那契来实现。通过下面的图来讲解:
在这里插入图片描述

源代码

public class Solution {
public int RectCover(int target) {
		if(target==0)
			return 0;
	    else if(target==1)
			return 1;
		else if(target==2)
			return 2;
		else 
		{
			return RectCover(target-1)+RectCover(target-2);
		}
    }
}

11题解–二进制中1的个数

题目描述

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

思路解析

这里首先理解原码,反码,补码的意思
正数的原码,反码,补码都是一样的
负数的原码就是正数的原码,但是最高为1标志符号位,反码就是将负数的原码除符号位外全部取反,补码就是对反码进行加1操作,注意在这个过程中符号位也是参与计算的。
下面我们通过举例来加深印象
7的原码:0000 0111
7的反码:0000 0111
7的补码:0000 0111
-7的原码:1000 0111
-7的反码:1111 1000
-7的补码:1111 1001
因为题目中规定有32位,所以我们还需要对转换成二进制的字符串进行修改,因为正数该有几位就是几位,并且正数的原码,反码,补码都一样,其次因为他不满的位数也是通过补0来进行,对于计算1的个数没什么影响
但是对于负数就不一样了,虽然在原码阶段没什么问题,但是在反码阶段因为要进行取反的操作,所以补位的0都会变成1,并且在之后的+1操作中可能还会发生变化,所以我们需要对负数的原码进行修改,将它改成32位。

源代码

public class Solution {
    public static int NumberOf1(int n) {
		int count=0;
		if(n==0)
			count=0;
		else if(n>0)
		{
			String string=Integer.toBinaryString(n);
			char[]ch=string.toCharArray();
			for(int i=0;i<ch.length;i++)
			{
				if(ch[i]=='1')
					count++;
			}
		}
		else 
		{
			String string=Integer.toBinaryString(Math.abs(n));
			string=String.format("%32s",string);//获得32位的
			int flag=0;
			char[]ch=string.toCharArray();
			//取反,获得反码
			for(int i=0;i<ch.length;i++)
			{
				if(ch[i]=='1')
					ch[i]='0';
				else 
					ch[i]='1';
			}
			//找到末尾连续的1,并且执行+1操作,实现反码到补码的转换
			for(int i=ch.length-1;i>-1;i--)
			{
				if(ch[i]=='0')
				{
					ch[i]='1';
					flag=i;
					break;
				}
				else 
					ch[i]='0';
			}
			for(int i=flag;i>-1;i--)
			{
				if(ch[i]=='1')
					count++;
			}
		}
		return count;
    }
}

12题解–数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0

思路解析

这题简单主要是要考虑好情况,因为exponent可能为正也可能为负,注意情况即可。

源代码

public class Solution {
 public double Power(double base, int exponent) {
	        double result=1.0;
	        if(base==0)
	        	result=0;
	        else if(exponent==0)
	        	result=1;
	        else if(exponent>0)
	        {
	        	for(int i=0;i<exponent;i++)
	        		result*=base;
	        }
	        else
	        {
	        	for(int i=0;i<Math.abs(exponent);i++)
	        		result*=base;
	        	result=1/result;
			}
	        return result;
	  }
}

都看到这里了,如果觉得对你有帮助的话,可以关注博主的公众号,新人up需要你的支持。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值