剑指offer(10-12)题解

简介: 剑指offer(10-12)题解

10题解–矩阵覆盖


题目描述

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


20200804164341256.png

比如n=3时,23的矩形块有3种覆盖方法

思路解析

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

20200804170331951.png

源代码

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;
    }
}
相关文章
|
消息中间件 设计模式 缓存
spring源码设计模式分析(四)-观察者模式
spring源码设计模式分析(四)-观察者模式
Foundation 列表4
列表菜单是Web页面中常见的导航元素,使用HTML的无序列表 `&lt;ul&gt;` 标签来定义。每个菜单项通过 `&lt;li&gt;` 标签包裹,并可包含链接 `&lt;a&gt;`。
|
机器学习/深度学习 自然语言处理 算法
FlowSeq、mBART、BERT-fused、mRASP、mRASP2...你都掌握了吗?一文总结机器翻译必备经典模型(2)
FlowSeq、mBART、BERT-fused、mRASP、mRASP2...你都掌握了吗?一文总结机器翻译必备经典模型
673 0
|
Linux iOS开发 开发者
解决提交到App Store时的ITMS-90478和ITMS-90062错误
本文为iOS技术博主分享,将详细介绍解决提交应用到App Store时可能遇到的ITMS-90478和ITMS-90062错误的方法。通过正确设置版本号,避免出现错误,并顺利将应用上架。
|
编解码 缓存 分布式计算
阿里云企业云服务器实例可选配置及适用场景汇总
本文介绍了阿里云企业级云服务器的主要实例规格及各自的适用场景、可选配置、最大基础带宽能力、最大网络收发包能力等信息,可供新手用户了解和选择适合自己的实例。
1193 0
阿里云企业云服务器实例可选配置及适用场景汇总
|
JavaScript 前端开发 API
IntersectionObserver交叉观察器
IntersectionObserver交叉观察器
215 0
IntersectionObserver交叉观察器
|
消息中间件 编解码 网络协议
RocketMQ源码分析-Rpc通信模块(remoting)一
上篇文章分析了Rocketmq的nameServer的源码,在继续分析源码之前,先考虑一个问题,设计一个mq并且是高性能的mq最最核心的问题是什么,我个人认为主要是有俩个方面,1:消息的网络传输,2:消息的读写,这两个决定了mq的高性能。
685 0
RocketMQ源码分析-Rpc通信模块(remoting)一
|
存储 新零售 数据采集
新零售数据中台:如何将SKU和SPU粒度数据表融合到一张表
作为新零售行业从业者,最常见的问题就是以何种粒度在数据仓库存储订单交易数据表。常见的粒度有三类:(1)以商品SKU为粒度存储订单数;(2)以商品SPU为粒度存储订单数据;(3)以交易订单为粒度存储订单数据。其中,第3种方式以交易订单为粒度存储订单数据,更加适合交易明细数据表,对于数据仓库存储方式不是很合适。因此,本文重点阐述如何将SKU粒度数据表与SPU粒度数据表进行融合。
新零售数据中台:如何将SKU和SPU粒度数据表融合到一张表
|
JavaScript 前端开发 开发者
JavaScript 编程风格(书写习惯)
JavaScript 编程风格(书写习惯)
233 0