剑指offer
buaadf
ARVR
3D
EE&CS
展开
-
剑指offer题解C++【1】
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 时间限制:1秒 空间限制:32768K 解题思路从右上角开始找,如果目标数比当前位置小,则左移;如果目标数比当前位置大,则右移;如果相等,说明目标存在;超出范围则说明目标不存在;代码class Solution { pu原创 2017-07-25 23:37:13 · 589 阅读 · 0 评论 -
剑指offer题解C++【14】链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路设原始链表共n个节点; 将原始链表复制到两个新链表p1和p2; 先找到p2的第k个节点; 然后p1和p2同时指向下一个节点,直到p2为nullptr,此时p1指向第n-k个节点,即倒数第k个节点;代码/* struct ListNode { int val; struct ListNode *next; List原创 2017-07-27 16:50:28 · 364 阅读 · 0 评论 -
剑指offer题解C++【15】反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路新建两个空链表p和pnext;当前元素为pHead; 先把下一个元素存下来,存为pnext; 将下一个元素变为p; 将当前元素pHead(已经反转)赋给p; 将pnext(即原先未反转的下一个元素)赋给pHead; 重复1~4,直到pHead为最后一个元素(指向nullptr)。 代码/* struct ListNode { in原创 2017-07-27 17:29:14 · 238 阅读 · 0 评论 -
剑指offer题解C++【16】合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路首先创建一个空链表Head作为合并后的链表; 如果其中一个链表为空,则将另一个链表赋给Head; 如果两个链表均不为空,则比较当前的val,将val小的赋给Head,并将指针移动至下一个元素,直到某一个链表为空。代码/* struct ListNode { int val;原创 2017-07-27 18:32:05 · 319 阅读 · 0 评论 -
剑指offer题解C++【17】树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路首先编写一个判定两棵树是否相同的函数isSame(TreeNode* p1, TreeNode*p2); 在HasSubTree函数中判断A的所有子树是否和B相同,若有相同的,则返回True。代码/* struct TreeNode { int val; struct Tree原创 2017-07-28 09:42:17 · 360 阅读 · 0 评论 -
剑指offer题解C++【18】二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10原创 2017-07-28 09:42:58 · 422 阅读 · 0 评论 -
剑指offer题解C++【19】顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路首先计算矩阵的行数和列数:行数=matrix.size(原创 2017-07-28 09:46:33 · 440 阅读 · 0 评论 -
剑指offer题解C++【20】包含min的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解题思路1定义两个栈,一个栈保存数据,另一个保存新数据入栈后的最小数 pop时,两个栈都要pop; 则minstack()的栈顶即为最小元素。代码class Solution { public: void push(int value) { mystack.push(value);原创 2017-07-28 09:47:41 · 276 阅读 · 0 评论 -
剑指offer题解C++【21】栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路创建一个栈进行压入、弹出操作。 当栈为空或者栈顶元素和popV当前元素不相等时,将pu原创 2017-07-28 10:58:49 · 1721 阅读 · 0 评论 -
剑指offer题解C++【22】从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路二叉树的层次遍历,借助一个队列实现。 创建一个队列,其中元素的类型为二叉树的节点; 按照“根-左-右”的顺序依次将二叉树的节点放入队列,每次从队顶取出对应节点的值,并删除队顶元素,直到队列为空。代码/* struct TreeNode { int val; struct TreeNode *left;原创 2017-07-28 11:40:11 · 419 阅读 · 0 评论 -
剑指offer题解C++【23】二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 后序遍历的顺序是左-原创 2017-07-28 22:19:01 · 635 阅读 · 0 评论 -
剑指offer题解C++【13】调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路复制原数组到一个新数组; 从前往后遍历,若为奇数,则依次替换原数组; 再次从前往后遍历,若为偶数,则继续替换原数组。代码class Solution { public: void reOrderArra原创 2017-07-27 16:32:06 · 439 阅读 · 0 评论 -
剑指offer题解C++【12】数值的整数次幂
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路库函数中有幂函数pow(x,y),如果你直接return pow(base,exponent);也能通过测试用例,但估计offer无缘了。为了降低时间复杂度,使用递归: 如果n为偶数,a^n=a^(n/2)*a(n/2); 如果n为奇数,a^n=a^(n/2)*a(n/2)*原创 2017-07-27 15:55:25 · 1104 阅读 · 0 评论 -
剑指offer题解C++【2】
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路首先计算字符串中的空格数量,若空格数量为count,则替换后的字符串长度增加2*count; 然后从最后一位开始替换字符,若为空格,则依次从后往前替换为’0’ ‘2’ ‘%’,否则不变; 由于已经知道了空格的数量,因此在替换完最原创 2017-07-26 14:06:18 · 360 阅读 · 0 评论 -
剑指offer题解C++【3】
题目描述输入一个链表,从尾到头打印链表每个节点的值。解题思路首先将链表中的值从头到尾压入一个栈中,然后再依次将值从栈中读取出来。 利用栈的先进后出原理即可。代码/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val原创 2017-07-26 14:12:37 · 275 阅读 · 0 评论 -
剑指offer题解C++【4】重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路 前序遍历:中-左-右 中序遍历:左-中-右 后序遍历:左-右-中前序遍历序列的第一个值就是root; 在中序遍历序列中找到root,root左侧为左原创 2017-07-26 14:55:26 · 245 阅读 · 0 评论 -
剑指offer题解C++【5】用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路队列C++队列queue模板类的定义在< queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。C++队列Queue类成员原创 2017-07-26 16:21:34 · 297 阅读 · 0 评论 -
剑指offer题解C++【6】旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路旋转数组可以分为两个有序的数组,最小元素就是这两个数组的分界点。可以用二分查找来解决: 当数组大小为0时,返原创 2017-07-26 22:58:51 · 290 阅读 · 0 评论 -
剑指offer题解C++【7】斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39解题思路斐波那契数列:1,1,2,3,5,8,13…… 第n项是第n-1项与n-2项之和,题目只要n<=39代码class Solution { public: int Fibonacci(int n) { if (n < 0) return -1;原创 2017-07-27 13:23:00 · 337 阅读 · 0 评论 -
剑指offer题解C++【24】二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路按照先序遍历将结点加入路径,如果当前结点是叶子结点则判断当前路径和是否为目标数,若满足条件,则把当前路径保存下来,并弹出结点;每一次递归返回父结点时,也回退一个结点。代码/* struct TreeNode { int val;原创 2017-08-04 16:12:13 · 1029 阅读 · 1 评论 -
剑指offer题解C++【9】变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路假设n级台阶有arr[n]种跳法; 第一次跳1阶,有arr[n-1]种; 第一次跳2阶,有arr[n-2]种; …… 第一次跳n-1阶,有arr[1]=1种; 第一次跳n阶,有arr[0]=1种; 综合以上,arr[n]=arr[0]+arr[1]+arr[2]+原创 2017-07-27 14:22:32 · 281 阅读 · 0 评论 -
剑指offer题解C++【10】矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路2*n的大矩形,设其横边为n,竖边为2,用n个2*1的矩形覆盖,共有arr[n]种方法; 若第一块矩形竖着放,则有arr[n-1]种; 若第一块矩形横着放,则第二块矩形也必须横着放,则有arr[n-2]种; 综上,arr[n]=arr[n-1]+arr原创 2017-07-27 14:31:08 · 469 阅读 · 0 评论 -
剑指offer题解C++【8】跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路对于n级台阶,假设有arr[n]种跳法; 1. 如果第一次跳1阶,那么总共有arr[n-1]种跳法; 2. 如果第一次跳2阶,那么总共有arr[n-2]种跳法; 3. 结合1,2,那么arr[n]=arr[n-1]+arr[n-2]代码class Solution { public:原创 2017-07-27 14:01:19 · 277 阅读 · 0 评论 -
剑指offer题解C++【11】二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路一个不为0的整数n,如果减1,那么(其二进制表示)原来处于最右边的1将会变为0,这个1后面的0(如果有的话)都会变为1,其余位数保持不变; 让n和n-1进行按位与,即n&(n-1),则会让n最右边的1变为0; 那么n的二进制中有多少个1,就可以进行多少次这样的操作。在计算机中,负数本身就是用补码表示的,因此不用考虑这原创 2017-07-27 14:46:38 · 323 阅读 · 0 评论 -
剑指offer题解C++【25】复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路原始链表:A->B->C->D->… 复制每个节点的内容为pnew,并放在相应节点之后(p->next),即 A->A’->B->B’->C->C’->D->D’->…设原创 2017-08-14 16:54:42 · 522 阅读 · 0 评论