剑指offer
一米阳光 zs
这个作者很懒,什么都没留下…
展开
-
剑指offer--判断规则二维数组是否存在一个指定数
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 分析:从左至右递增、从上至下在递增 可以以左下角的那个元素为起点,指定个元素与其相比较,做相应移动 class Solution { public: bool Find(int targe原创 2017-03-11 20:31:09 · 1226 阅读 · 0 评论 -
链表面试题之链表逆置、指定前k个逆置
单链表逆置我们大概很熟悉,但对于链表前k个逆置,可能不大常见,这是一道链表逆置的变种,其中变种的还有链表倒数第k个、链表k个组成一组,组内逆置,在这里我给大家分享一下我的想法。 对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。 typedef int原创 2017-07-26 20:17:26 · 1011 阅读 · 0 评论 -
二叉树面试题之二叉树镜像
首先分析,互为镜像,也就是说,一个节点的左右子树互相交换位置,因此采用递归的方法较为简单,且方便理解,即镜像步骤: 1)、交换根结点的左右子树节点。 2)、交换左子树(以图中10为例)的左右节点。 三、交换右子树(以图中6为例)的左右结点。 总结上面过程,一颗树的镜像过程:先前序遍历树的每个节点,如果遍历到节点有子节点,就交换它的两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了原创 2017-07-26 19:06:09 · 468 阅读 · 0 评论 -
剑指offer--递归非递归合并两个有序链表
面试题:合并两个有序链表,合并之后需要变为有序 对于此题,我想到的有两种解法:递归和非递归 递归实现: //递归 Node *MergeList(Node *pHead1, Node*pHead2) { if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHead1; else {原创 2017-07-13 23:09:26 · 926 阅读 · 0 评论 -
剑指offer---复杂链表复制
剑指offer面试题---复杂链表复制 分析此题:1.首先要将链表的每一个节点复制一份,连在被复制节点后面。 2.将对应的指向关系也对应复制。 3.分离原链表、复制链表。 代码实现: struct ComplexListNode { int _data; ComplexListNode* _next;原创 2017-07-13 23:25:37 · 755 阅读 · 0 评论 -
剑指offer--据前序和中序遍历重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:此时不由得想起前序遍历的顺序是根--左--右 #include #include #include using namespace st原创 2017-03-16 18:55:18 · 788 阅读 · 0 评论 -
剑指offer--指定链表逆序打印
题目:输入一个链表,从尾到头打印链表每个节点的值。 首先分析这个题,如果面试官没有指定说明不允许改变链表结构,首先会想到的是将链表的头部和指针方向改变,但如果面试官说了不能改变链表结构,就得考虑别的方法,此刻你有没有想到一种结构先进后出,对没错,就是栈,如果将链表顺序遍历一遍,将链表中的元素一一PUSH进栈中,然后再将数据一个个拿出来访问,此刻,顺序就逆置了,然而还有优化原创 2017-03-14 22:58:20 · 722 阅读 · 0 评论 -
剑指offer--调整数组顺序使奇数位于偶数前面
面试题:调整数组顺序使奇数位于偶数前面 当拿到这个题目,你首先会想到的是遍历这个数组每碰到偶数时,拿出这个数字与其后的数字交换,但这样的话其时间复杂度为O(n*n) 若面试官没有时间复杂度的要求,那么这样就可以了 但是往往不能体现出你的能力,你还可以优化,我们可以维护两个指针, 1)原创 2017-04-16 20:33:26 · 1467 阅读 · 0 评论 -
剑指offer--o(1)时间删除链表结点
面试题:在O(1)时间删除链表结点 最常规的想法无非是遍历这个链表,然后删除该结点,但查找的时间复杂度是o(n)显然不符合题目要求 估计接触过链表的都会知道常规链表的删除方法,解题思路: 1) 删除节点i之前,先从链表的头节点开始遍历到i前面的一个节点h,再把h的next指向i的下一个节点,删除节点i,记住要把指针置为空,在这要考虑的问题有很多原创 2017-04-16 20:55:43 · 477 阅读 · 0 评论 -
继承,菱形继承,多态,虚继承、菱形虚拟继承
面的代码主要写了关于: (1).继承和派生的关系 (2).6个默认函数的继承(拷贝,拷贝构造,赋值,析构,...) (3).普通菱形继承 (4).多重虚继承 (5).多态 (6).虚表 (7).虚菱形继承 其中涉及到了很多C++中的内容,如,, 等等 #ifndef INHERIT_H_ #define INHERIT_H_ #include #inclu转载 2017-04-16 21:42:02 · 790 阅读 · 0 评论 -
剑指offer--两个栈实现一个队列
题目:两个栈实现一个队列 分析: 方法一: s1是入栈的,s2是出栈的。 入队列,直接压到s1是就行了出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中 缺点:有大量元素要push和pop,效率不高 方法二: s1表示入队的,s2表示出队列的,保证所有元素在一个栈中 入队列:如果s原创 2017-03-16 21:30:36 · 773 阅读 · 0 评论 -
查找一个字符串中第一个只出现两/一次的字符
题目:查找一个字符串中第一个只出现两/一次的字符 一、查找一个字符串中第一个只出现两次的字符。 比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)。 分析问题: 方法1、O(N^2) 看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果后面出现两次该字符,那原创 2017-07-26 20:47:39 · 1630 阅读 · 0 评论