剑指offer(10-12)题解
剑指offer(10-12)题解
- 10题解--矩阵覆盖
- 11题解--二进制中1的个数
- 12题解--数值的整数次方
10题解–矩阵覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
比如n=3时,23的矩形块有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;
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 刚刚!程序员用力过猛,燃起来了!
- VSCode 中文乱码
- Python获取时间戳
- VScode Python no module的解决方法
- MacOS安装npm全局包的权限问题
- [已解决]报错run `npm audit fix` to fix them, or `npm audit` for details
- Hexo使用攻略-添加分类及标签
- print的简单使用
- 使用Pandas读取大型Excel文件
- 微信小程序获取页面高度
- vue简单实现九宫格抽奖
- [已解决]报错:xlrd.compdoc.CompDocError: Workbook: size exceeds expected 17920 bytes; corrupt?
- [已解决]报错:have mixed types. Specify dtype option on import or set low_memory=False
- Mysql删除表数据,表文件大小不变
- 抓取模板