随笔分类 -  剑指Offer记录

摘要:一.题目实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。二.思路这道题很简单,但是要留意一些细节,比如底数为0,指数不能为负数(不能对0求倒)底数、指数均为0,最后结果是1。在数学里面0^0是未定式;但在离散里面0^0=1;在计算机中,规定了0^0=1;我们可以用如下的公式求a的n次方... 阅读全文
posted @ 2018-11-08 10:56 OVS98 阅读(214) 评论(0) 推荐(0)
摘要:一.题目请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。二.思路思路一先判断整数二进制表示中最右边一位是不是1;接着把输入的整数右移一位,此时原来处于从右边数第二位的数移到了第一位,再判断是不是1;这样每次移动一位,直到整个整数变为0为止。缺点:如果一个数是负数,那么右移之后,左边会用符号位1填充,这样一直做右移... 阅读全文
posted @ 2018-11-02 11:05 OVS98 阅读(260) 评论(0) 推荐(0)
摘要:一.题目给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0] * k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。二.思路我们首先看一下该问题是否符合动态规划的4个特征:求一个问题的最优解整体问题的最优解依赖于各个子问题的最优解... 阅读全文
posted @ 2018-11-01 18:46 OVS98 阅读(289) 评论(0) 推荐(0)
摘要:一.题目地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?二.思路典型的回溯法可以解决的问题,不过加了一些子函数去做一些... 阅读全文
posted @ 2018-11-01 11:14 OVS98 阅读(198) 评论(0) 推荐(0)
摘要:一.题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。二.思路这是一个可以用回朔法解决的典型题。首先,在矩阵中任选一个格子作为路径的起点。假设矩阵中某个格子的字符为ch,那么这个格子不可能处在路径上的第i个位置。如果路径上的第i个字... 阅读全文
posted @ 2018-11-01 10:47 OVS98 阅读(308) 评论(0) 推荐(0)
摘要:一.题目把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{ 3, 4, 5, 1, 2 }为{ 1, 2, 3, 4, 5 }的一个旋转,该数组的最小值为1。二.思路由于原始数组是递增排序的数组,我们可以发现旋转之后的数组仍然可以分为两个递增排序的子数组,而且前一个子数组中的任意一个元素都要大于后面子数组中的元素,... 阅读全文
posted @ 2018-11-01 09:47 OVS98 阅读(103) 评论(0) 推荐(0)
摘要:斐波那契数指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 这个数列从第三个数开始,之后的每一个数都由它前的两数相加得到。我们知道在编程中我们可以用递归和迭代两种方法求指定的斐波那契数,但这两种方法各有利弊。区别:递归法(时间复杂度O(2^n))写出来的代码可读性强,就相当于把书上的数学公式 翻译成代码,但这种方法效率太慢了,当你求第50个斐波那契数,你的电脑可能得运算十多分钟。而... 阅读全文
posted @ 2018-10-30 21:26 OVS98 阅读(176) 评论(0) 推荐(0)
摘要:一.题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。二.思路使用两个栈stack1和stack2,若添加元素则直接压入栈stack1中;若删除元素,则要分情况:如果栈stack2为空,则把栈stack1中的元素弹出压入栈stack2中,此时从栈stack2中弹出数据的顺序符合队列的特... 阅读全文
posted @ 2018-10-30 13:12 OVS98 阅读(164) 评论(0) 推荐(0)
摘要:一.题目给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。二.思路分析题目之后,我们发现,待处理节点只存在三种状态,我们分别处理即可:待处理节点有右子树。那么它的下一个节点为其右子树的最左子节点,如上图节点3的下一个节点为8;待处理节点无右子树,且是父节点的左节点。那么它的下一个节点为其父节点,如上图节点5... 阅读全文
posted @ 2018-10-30 12:24 OVS98 阅读(149) 评论(0) 推荐(0)
摘要:一.题目输入某二叉树的前序遍历和中序遍历结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{ 1, 2, 4, 7, 3, 5, 6, 8 }和中序遍历序列{ 4, 7, 2, 1, 5, 3, 8, 6 },则重建的二叉树如图所示:二.思路首先根据前序遍历序列找到根节点(序列第一个元素即为根节点),然后在中序遍历中找到根节点位置,然后递归确定左子树... 阅读全文
posted @ 2018-10-30 11:02 OVS98 阅读(149) 评论(0) 推荐(0)
摘要:一.题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 二.思路 本题有两种方式解决: 但需要注意的是:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显然用栈基于循环实现代码的鲁棒性更好一些。 三.代码 2. 递归实现 四.本题考点 阅读全文
posted @ 2018-10-29 17:44 OVS98 阅读(123) 评论(0) 推荐(0)
摘要:一.题目请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy!”,则输出“We%20are%20happy!”二.思路这里替换空格还会造成字符串长度的延长,这是本题的关键。如果是在原来的字符串上做修改,就有可能覆盖修改在该字符后面的内存,如果是创建新的字符串并在新的字符串上进行替换,那么我们可以分配足够多的内存。因而有两种解决方案,我们应该与面试官沟通一下。这... 阅读全文
posted @ 2018-10-26 11:03 OVS98 阅读(197) 评论(0) 推荐(0)
摘要:一.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数例如:从下面的二维数组中查找7返回true,查找5返回false 1 2 8 9 2 4 9 12 4 7 10 13 ... 阅读全文
posted @ 2018-10-26 10:20 OVS98 阅读(148) 评论(0) 推荐(0)
摘要:一.题目一 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 例如: 输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3 二.思路 三.代码 方法一 阅读全文
posted @ 2018-10-25 21:11 OVS98 阅读(152) 评论(0) 推荐(0)
摘要:一.题目 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 二.注意点 是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this)。只有返回一个引用,才可以允许连续赋值。否则,如果函数的返回值是void,则应用该赋值运算符将不能进行连续赋值。 是否把传入的 阅读全文
posted @ 2018-10-24 12:29 OVS98 阅读(164) 评论(0) 推荐(0)