刷题笔记
萌笙
初窥门径CVer
展开
-
剑指Offer11 二进制中1的个数
剑指Offer11 二进制中1的个数 题意 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 思路 做这个题目时,发现自己对计算机中补码反码原码的理解不够深入,这里再复习一下: 在计算机中,所有的数值都是以其补码表示的,因为用补码可以将两个数的剑法转化为加法,方便加法器工作。 对于正数,其源码、补码、反码都是一致的(除此之外还有移码,就是将补码的符号位取反),一般以最高位作为符号位,正数的符号位为0,负数为1,则例如32位(4字节)的有符号整型数,第一位是符号位,低位的31位是数值位,原创 2020-10-16 15:46:28 · 67 阅读 · 0 评论 -
剑指Offer10 矩阵覆盖
剑指Offer10 矩阵覆盖 题意 我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 思路 我们可以使用的小矩形的为2x1, 需要覆盖的面积为为2*n, 则递归地看,只有两种情况,一种是先固定一块,剩下n-1块,其覆盖方法为f(n-1),如a所示,固定两块(并列),剩下n-2块,其覆盖方法为f(n-2),如b所示: 则对于覆盖长度为n的块有:f(n) = f(n-1) + f(n原创 2020-10-16 15:45:26 · 88 阅读 · 0 评论 -
剑指Offer09 变态跳台阶
剑指Offer09 变态跳台阶 题意 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路 和之前跳台阶的方式不一样,这次可以跳任意阶数(1,2,3,…,n),则可以做如下分析: 可以先选择跳1阶,那么剩下的n-1阶共有f(n-1)种跳法。。 可以选择先跳2阶,那么剩下的n-2有f(n-2)种跳法。。 以此类推。。。 先跳n-2阶, 后面有f(2)种跳法 先跳n-1阶, 后面有f(1)种跳法 先跳n阶, 只有一种跳法f(0) 种跳法 所以:原创 2020-10-16 15:42:30 · 66 阅读 · 0 评论 -
剑指Offer08 跳台阶
剑指Offer08 跳台阶 题意 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 思路 因为只有跳1阶或2阶的跳法,所以可以尝试用递归方法,递归方法有两个重要的点要注意: 递归边界:即什么时候结束递归,对于此题,很明显就是J[1] = 1, J[2] = 2; 递归链条:即寻找后面的元素与前面元素的关系。 这个题目实质上就是一个从1,2开始的斐波那契数列,但自己一开始意识到这个问题,我的思考过程如下: 根据递归,我可以跳至n-1原创 2020-10-08 12:20:44 · 50 阅读 · 0 评论 -
剑指Offer07 斐波那契数列
剑指Offer07: 斐波那契数列 题意 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39 思路 递归求解:超时 打表求解:内存超限 综合前两者,其实只需要一个长度为3的数组,然后根据下标模3运算得到当前index, 再求得前两位的index,相加更新当前位置即可。 代码 class Solution { public: int Fibonacci(int n) { int F[3] = {0,1,原创 2020-10-08 11:11:21 · 66 阅读 · 0 评论 -
剑指Offer06 旋转数组的最小数字
剑指Offer06: 旋转数组的最小数字 题意 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路 根据旋转数组的定义,其实旋转数组实质上就是两个非递减的序列组合而成,前一个序列不小于后一个序列,因此寻找旋转数组中的最小值就是寻找两个序列的分界点,即出现array[i+1] <原创 2020-10-08 11:10:49 · 52 阅读 · 0 评论 -
剑指Offer05 用两个栈实现一个队列
剑指Offer05 用两个栈实现一个队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路 对于使用的两个队列,一个用以做插入操作,即push, 另一个用以做删除操作。在没有pop操作时,可以一直向stack1中压栈,而stack1中反序就是队列的顺序,当有pop(出队)操作时,再判断stack2是否为空, 不为空直接出栈,若为空则将stack1中的元素逐个出栈并压入stack2。 代码 class Solution { public: void原创 2020-10-08 11:09:23 · 58 阅读 · 0 评论 -
剑指Offer04 —重建二叉树
剑指Offer04 —重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路 二叉树有先序,中序,后序、层次等几个常见的遍历次序,值得注意的是,中序遍历与其他三种遍历中的任何一种结合,均可以唯一地确认一棵二叉树。原因在于可以通过先序、后序或者层次遍历区分出原二叉树(包括二叉树的子树)的根结点,通过该根原创 2020-10-08 11:07:55 · 62 阅读 · 0 评论 -
剑指Offer01 二维数组中的查找
剑指Offer01: 二维数组中的查找 题意 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路 因为二维数组中的元素从左到右递增,从上到下也递增,所以可以从左下角或者右上角开始搜索,从左下角开始搜索时,若当前元素大于目标元素,则向右走一步,若小于,则往上走一步。 代码 class Solution { public: bool Find(int tar原创 2020-10-08 11:05:31 · 50 阅读 · 0 评论