![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
文章平均质量分 57
apsara-jueying
阿里云菜鸟攻城狮
展开
-
剑指offer面试题50!!!树中两个最低公共祖先
庆祝!!!最后一篇剑指offer系列博客!/*这本书,,终于看到最后一个题了。太激动了。这还是以面试的实际案例给出的当给除这个题目的时候 首先看是不是二叉树如果是bst 那直接找比一个小 比另一个大的如果说只说普通的树 先问有没有指向父亲的指针 有的话就相当与 两个链表的第一个重合节点么如果没有指向父节点的指针 那也好办 直接遍历 然后记录路径就行了最后两个路径的最后一个相同的点原创 2013-05-15 16:33:00 · 799 阅读 · 0 评论 -
剑指offer面试题38 数在有序数组中出现的次数,二分找第一个和最后一个出现的这个数字
/*这题太棒了。。剑指offer是我大学生涯读过最好的一本书了。看到有序数组 找一个数肯定是想到二分 找到后 前后探查 看一共多少个。但这样前后探查 复杂度和遍历一遍一样 都是O(n) 肯定是不好的我们希望这个复杂度是logn 这样的话。。想到找到数组中第一个k和最后一个k那就是改一下二分的条件写两个二分 分别找第一个k和最后一个k找第一个的时候 如果找到了k 看是不是第一个 是就返原创 2013-05-11 10:36:07 · 727 阅读 · 0 评论 -
数据库方面的面试题
1存储过程和函数的区别存储过程相当于一个脚本 是一系列sql语句的集合 针对某个特定的表函数是数据库已经定义好的方法 接受参数 返回某种类型的值 不涉及特定表2database transaction 数据库事务是什么?单个逻辑工作单元! 事务就是一种单个逻辑工作单元 这些操作要么全做 要么不做 四个特点原子性 要么做要么不做一致性 事务的运原创 2013-05-23 11:05:30 · 815 阅读 · 0 评论 -
剑指offer面试题36 数组中逆序对个数,hulu面试题,要求写代码发过去
这题还是改了挺久bug的。。/*这给题是李舵发给我文档的 hulu的面试题 要写代码发给我。。至于hulu是什么神一样的公司。。我也不知道了刚才百度了一下 是和youtube一样的视频公司。虽然还不怎么出名。这个题目 大概瞟了一眼书上的图 瞬间明白了。。其实就是一个归并排序的过程每次 对于两个待归并的数组,两个指针,从头开始扫描数组,每次选择一个排序如果是选了前面的 那没事儿如原创 2013-05-08 22:27:14 · 1304 阅读 · 0 评论 -
关于比较易错的字符串面试题的总结,不断更新
1C/C++把常量字符串放在一个单独的区域 不是堆和栈 再另一个叫文字常量区的地方当把相同的string常量赋值给不同指针 时 指针 这些指针其实指向同样的区域但是用常量内存初始化字符数组 就不一样了。比如char str1[]="gaolei";char str2[]="gaolei";char * str3="gaolei";char * str4="gaole原创 2013-05-21 13:45:04 · 975 阅读 · 0 评论 -
剑指offer面试题48C++写一个不能被继承的类
/*在C#和java中分别有关键字sealed 和 fina表示一个类不能被继承 但是C++ 没有可以这么想 一个派生类 必须调用父类的构造函数和析够函数 如果父类把构造函数和析够函数定义成private了即便共有继承 private 的内容也在子类不可见这个类不能被继承 通过静态函数调用构造函数*/#include#includeusing namespace s原创 2013-05-21 18:43:25 · 896 阅读 · 0 评论 -
剑指offer面试题35第一个只出现一次的字符,用hash
/*很简单但是很不错的题目。 一类题目。。。就是简历字符的hash表 空间换时间给一个字符串 找出第一个 只出现一次的字符遍历两次数组 第一次遍历 完成hash表第二次 从前往后找遇到第一个只有一个的字符就是答案*//*#include#include#includeusing namespace std;char FirstNoRepeatingChar(char *原创 2013-05-08 09:46:09 · 538 阅读 · 0 评论 -
剑指offer面试题34丑数 做过不止一次的DP
/*第一次看这题也是一年前的事儿了。。那时完全想不出来那么经典的算法。丑数是另一个数的丑数*/#include#include#includeusing namespace std;int arr[3000];void init(){ arr[1]=1; int index=1; int index2=1; int index3=1;原创 2013-05-07 10:48:57 · 699 阅读 · 0 评论 -
剑指offer面试题32从1到n整数中1出现的次数,找数学规律
/*从1到n的n个数字 十进制表示 1出现的次数 肯定是数学题找规律呗比如输入数字是21345 分而治之1-1345 1346-21345 先求第二段 万位是 一共1w个 然后再分称1346-11345 11346-21345 每段的四个数字中 其中一个是1 其余10^3所以一共两千 就这么分 这个代码 理解的将就吧。。。反正就是把数字拆分开求 又看了两便理解了。 书上有写错的地方原创 2013-05-06 20:57:57 · 734 阅读 · 0 评论 -
剑指offer面试题 39 二叉树的深度和判断是不是平衡树
#include#include#include#includeusing namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; BinaryTreeNode(int t):data(t){}};原创 2013-05-11 13:35:30 · 810 阅读 · 0 评论 -
剑指offer面试题40数组中只出现一次的两个数字,异或好题
/*这个题目太精彩了。。还记得一年多以前做市赛预赛 遇到 数组中只有一个只出现一次的数字这回是两个数字出现了一次 其余出现了两次其实我们还是把思路往只有一个上想全部异或一遍 得到的是这两个数字异或的结果通过这个结果 我们可以把数组分成两部门,每个部分包括两个数字中的一个 和若干对数字。我们看这个数字 最高位的1.。。。肯定只属于两个数中的一个。。因为异或么。也就是说这两个数字 只有原创 2013-05-11 14:15:05 · 653 阅读 · 0 评论 -
剑指offer面试题45圆圈中最后一个数字,约瑟夫环模拟和数学解法
/*这题也是以前做ACM做的 模拟 还有一种是找数学规律 就是通过函数对应的。这题其实也没什么好写的 但是里面用了stl的list 我从来没用过。。*/#include#include#includeusing namespace std;int LastRemaining(int n,int m){ if(n<1 || m<1) return -1; int原创 2013-05-13 20:40:57 · 978 阅读 · 0 评论 -
剑指offer面试题14 调整数组元素顺序使得奇数在前半部分偶数在后半部分
这个自己相想了一个快排思想的 测试了 应该是没有问题。:-) 双指针用过很多次了。。这里最主要的一个问题是我第一次用函数指针 主要针对可扩展性的/*这题也是自己一下子就想到了 一个是双指针 一个是快排的思想。。标准解法是双指针,但是这里提到了一个非常重要的问题就是扩展性 如果面试官问 不按奇数偶数排序 而是按照 正负呢 如果按照 是不是三的倍数呢?这里就要用函数指针了。。。好激动啊。。第一原创 2013-04-30 19:31:12 · 536 阅读 · 0 评论 -
剑指offer面试题47不用加剑乘除做加法,考虑加法的过程用位运算
/*这个就是用位运算模拟加法的过程 我们这么想 两个数相加先把对应位的数加起来 不考虑进位 加完后 再把进位都加上如果还产生进位的话 上一步加得的结果 再加进位 直到没有进位*/#include#includeusing namespace std;int Sum(int a, int b){ int sum,tmp; do{ sum=a^b;原创 2013-05-13 21:27:21 · 944 阅读 · 0 评论 -
剑指offer面试题46求1+2+..+n不能用乘除法和选择循环,多种发散思维方法
/*这题在实践中挺没意义的 但是很考察所谓发散思维 其中也加深了对虚函数 函数指针的理解一共几种方法 一一说吧*/#include#includeusing namespace std;class A{ public: A(){++n;sum+=n;} static int getsum() { return sum; }原创 2013-05-13 21:16:35 · 945 阅读 · 0 评论 -
剑指offer面试题43 n个骰子的点数
/*题目是仍n个骰子 求各点数和出现的概率概率计算么,一共是6^n 。。。然后计算各点数和出现的次数一除就行了么但是这里 问题就在于怎么计算各点数出现的次数和。。一种是递归 一种是循环递归 肯定效率不好。。循环的话 想法很好。。*/#include#include#include#includeusing namespace std;const int maxn=6;/原创 2013-05-13 20:07:59 · 778 阅读 · 0 评论 -
剑指offer面试题44扑克牌的顺子
/*题意就是写一个函数 输入是一个数组判断这个数组是不是扑克牌的顺子 注意0可以代表任何数字三步 一 排序 二 统计0的个数三 看其余部门 相邻元素之间差多少*/#include#include#includeusing namespace std;int cmp(const void * p1,const void * p2){ return *(int *)p1原创 2013-05-13 20:08:25 · 660 阅读 · 0 评论 -
剑指offer面试题42翻转单词顺序VS左旋字符串
/*书上书很多公司用这个题 特别大众化就是一个句里 反转所有单词的顺序 但是单词内部不能变可以通过两次反转 第一次全反了 第二次 把每个单词的再返回来刚才查了一下reverse函数 只能C++ 容器用啊。。所以还是自己写吧*/#include#include#include#includeusing namespace std;void Reverse(char * be原创 2013-05-11 16:47:13 · 654 阅读 · 0 评论 -
剑指offer面试题41和为s的两个数字VS和为s的连续正数序列
/*这种题目太眼熟了。。就是双指针的题目。比较有意思第一个算法 要求在有序数组中 找到和为s的两个数字 直接双指针一个从头一个从尾如果和比s大 尾巴往前如果和比s小 头往后*/#include#includeusing namespace std;void FindTwonum(int * arr,int len,int s){ int head=0,tail=len-原创 2013-05-11 15:49:20 · 848 阅读 · 0 评论 -
剑指offer面试题30最小的k个数
/*这种题目一看就知道可以用partition算法做。。。 和上面一题几乎一样的的再敲一遍代码把 这种方法的弊端是 要改变原来的数组 还有一种O(nlogk) 的算法就是维护一个最大堆 这牙膏不改变原来数组但是堆。现在让我写 我已经写不出来了 就用有限队列就可以还可以用红黑数RBtree stl的set map 都是用红黑树的rbtree就是通过把节点分为红色和黑色两种颜色 然后一定原创 2013-05-05 21:32:54 · 634 阅读 · 0 评论 -
剑指offer面试题24判断一个序列是否为BST的后序遍历序列附加输入递归的创建二叉树
/*之前写的二叉树都是自己暴力创建的 这回写一个可以递归创建的 然后用-1表示NULL*/#include#includeusing namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; Binar原创 2013-05-04 15:08:13 · 584 阅读 · 0 评论 -
剑指offer面试题25二叉树中和为某一个固定值的路径
#include#include#includeusing namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; BinaryTreeNode(){}};void CreateBinaryTree原创 2013-05-04 16:45:36 · 474 阅读 · 0 评论 -
剑指offer面试题12 打印从1到最大n位的所有数(大数,递归)
/*初看觉得很水 不过就是个大数么 但是突然发现很有收获 就是自己想*/#include#include#includeusing namespace std;bool NumberAdd(char * num)//不是最后一个数返回0 继续加 否则返回1 表示到了头{ bool isOverflow= false;//判断是不是到了最后一个数字 只要看最高位是不是有原创 2013-04-30 16:17:59 · 593 阅读 · 0 评论 -
剑指offer面试题13在O(1)时间复杂度内删除单链表的一个节点
今天遇上奇怪的事情了。。codebloks运行不了 说sh: .....upexpected ( 我找了半天bug 最后发现竟然连helloword程序都执行不了后来我觉得 会不会是 project命名的里 O(1) 然后试着把括号去掉。。居然就行了 后来又建工程加上括号 又是那个错。。太尼馬诡异了。。。还有就是 linux里面 EOF 是ctrl+d 不是C 记得windows里是原创 2013-04-30 17:13:55 · 717 阅读 · 0 评论 -
剑指offer面试题11 编写pow函数(输入底数 指数 正 0 负的情况 和高效乘方)
#include#include#includeusing namespace std;/*这一章开始进入代码规范性了 主要是容错 边界处理 变量和函数的命名以后一定要记得 变量和函数名 命名看出意义 直接用全部英文单词命名,单词首字母大写出错时的三种处理方式第一 返回值 windows 很多API 都这么干 返回0 正常 但是这样有缺点就是不能通过返回值表示得到的结果第二 全局原创 2013-04-27 19:33:49 · 750 阅读 · 0 评论 -
剑指offer面试题10 二进制中1的个数(位运算专题)
#include#includeusing namespace std;// !!!!!!!!!!!!非常重要!!把一个整数和这个整数减去1后的结果做与运算 得到的是把这个整数最右边的1变成0后的结果//如果输入负数 输出补码表示的 有多少个1//如果n是负数 n&(n-1) 同样是把n最右边的1变成0//这里 是求一个整数的二进制补码表示中 1的个数int NumberOf1(in原创 2013-04-27 19:26:37 · 562 阅读 · 0 评论 -
剑指offer 面试题9 递归 非波那且数列
/*这实在没什么好敲的。这里主要讲的几个问题第一个 面试时如果没有特殊要求 就递归第二 非波那且 循环不用开数组 只要记录前两个就行了。其实也不是完全没价值 如果让我 我就开数组了。开尼馬数组干蛋啊 只球fn还有这里有个题目 挺有意思。。。都是和非波那且有关系的1青蛙每次可以跳一个台阶 或者两个 问到第n台阶多少种方法 这个早就知道 就是非波那且的fn2如果青蛙每次可以跳任意原创 2013-04-27 19:26:00 · 657 阅读 · 0 评论 -
剑指offer 面试题8 旋转数组的最小数字 (旋转数组就是把有序数组后面一部分挪到前面)
/*题意是 给出旋转数组 就是把一个有序的数组 后面取出n个元素 放到前面。现在要找出最小的元素 o(n) 太简单了 肯定不行。想法还是二分数组 我们每次找到一个mid 如果这里的数比前面的大 说明最小的肯定在后部分如果比后面的小 说明 肯定在前半部分还有注意两种特殊情况 就是 数组本来有序还有一种 就比如1 1 1 0 1这样的。start 和 end 还有mid 指向的都相等的情原创 2013-04-27 19:24:17 · 602 阅读 · 0 评论 -
剑指offer面试题7 两个栈实现队列和template的应用
这就很简单了 这里还提到用两个队列实现栈 以前看过那本书说不能 其实完全可以啊插入队列 就找有元素的队列插入 删除 就把队列除了最后一个都移动到另一个队列然后pop最后一个。这个两个栈实现一个队列么 挺简单的 早就看过了 但是很久没敲过 模板类的东西了 就是template#include#include#includeusing namespace std;原创 2013-04-25 21:05:17 · 681 阅读 · 0 评论 -
剑指offer 面试题6 (根据前序和中序 构建二叉树)
这题 浪费了不少时间。。不知道自己现在怎么了。。遇到文件 就总要逃避一下。。唉。。总的来说非常经典的题了。。就是构建函数 那 尤其是都用指针 太经典了/*给出 两个数组 前序和中序 要建立二叉树 返回root节点。。本来不难的题结果自己看了半天。。唉。。好久不写二叉树了。*/#include#include#include#includeusing namespace原创 2013-04-25 20:38:18 · 643 阅读 · 0 评论 -
剑指offer面试题15 链表中倒数第k个节点(又是双指针,重要的是代码鲁棒性)
/*前面一个学习了代码的扩展性 用函数指针。这本书其实一直在强调代码的鲁棒性 也就是健壮性主要是对输入非法数据的处理这里的鲁棒性 主要体现在三个方面1 输入空指针怎么办2 输入k小于等与0.3 输入的k比链表长度小*/#include#include#includeusing namespace std;struct Node{ int data;原创 2013-04-30 21:07:32 · 459 阅读 · 0 评论 -
剑指offer面试题16 反转链表(递归和非递归,主要还是看代码的鲁棒性)
/*这题早就做过了,但是当时看的书上的代码真的很差,比其这本书差的不少。。剑指offer真是我大学看过的最好的书之一了反转链表 需要对链表进行遍历 每次对于遍历到的节点,先记录next,再next指向前一个,然后继续遍历 注意不要把链表弄段还有注意输入 最主要的是输入头节点NULL 的处理 测试数据要想到 只有一个节点怎么办 两个,多个怎么办 输入NULL 怎么办只要自己想到测试数据都过原创 2013-05-01 10:29:22 · 653 阅读 · 0 评论 -
剑指offer面试题22栈的压入弹出序列
/*记得有一种规律 如果如栈序列是有序的 比如1 2 3 4 5有一种规律的 忘记了但是这里不一定是有序的 就模拟了。规则是如果下一个要弹出的数字刚好是栈顶数字 那么直接pop如果不是的话 从如栈序列还有入栈的数字 压入栈 知道遇到这个数字*/#include#include#includeusing namespace std;bool IsPopOrder(const原创 2013-05-02 21:22:07 · 573 阅读 · 0 评论 -
剑指offer面试题21包含Min函数的栈 经典的百度面试题
/*多半年前就看过了 今天终于可以来挑战了自己定义一个栈的数据结构 里面包含得到最小值的Min函数 push pop Min 都是O(1)的没有空间要求,我们定义一个栈data 和一个 辅助栈mindata每次压入的时候 data正常压入,mindata则看当前的压入的值 如果小于最小值 那么mindata压入新的 否则mindata压入mindata的top 就是最小的所以 minda原创 2013-05-02 20:21:24 · 623 阅读 · 0 评论 -
剑指offer面试题19二叉树的镜像和二叉树的前中后遍历递归和非递归算法
#include#include#include#include#includeusing namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode * leftchild; BinaryTreeNode * rightchild; BinaryTreeNode(int t)原创 2013-05-02 18:28:43 · 1085 阅读 · 0 评论 -
剑指offer面试题23 从上往下打印二叉树 就是广度优先遍历二叉树
这个太水了吧。。我都不好意思写博客。。为了这个系列的完整啊。。正好补齐了下午的 dfs二叉树 #include#include#include#include#includeusing namespace std;struct BinaryTreeNode{ int data; BinaryTreeNode * leftchild; Bina原创 2013-05-02 21:30:31 · 594 阅读 · 0 评论 -
剑指offer面试题49atoi函数的编写
/*这本书终于进入了最后一章。。太激动了这里的题目是一个特别寻常普遍的 写atoi 意思是 ASCII to Integer是面试实例 有很多经典的地方要注意的需要注意的地方1 检查是否是空指针2 如果是空指针 标记一个全局变量来区分 是得到0还是空指针3 如果是空字符串4 正符号的问题5 非法输入的问题6 边界值的问题*/#include#includeusing原创 2013-05-15 14:38:37 · 887 阅读 · 0 评论 -
剑指offer面试题20顺时针打印矩阵
/*这个题早就做过了 但每次记不住顺时针打印矩形。就找规律模拟的打印就行了把矩形看成若干个圈组成的 主要是分析 每次打印一圈*/#include#include#includeusing namespace std;void InitMap(int **map,int n,int m){ int k=1; for(int i=0;i<n;++i)原创 2013-05-02 19:40:35 · 571 阅读 · 0 评论 -
剑指offer面试题18判断一个二叉树是否包含另一个的递归算法
/*这里比较蛋疼的问题就是建立这个二叉树 我是直接暴力建立的 如果要输入建立的话可以递归的创建 标记一个不会出现的值为NULL 比如-1 首先输入根节点然后输入左子树 如果输入-1表示左子树是空的。。。如果输入不是-1 那么递归的创建左子树。再递归的创建右子树*/#include#includeusing namespace std;struct BinaryTreeNod原创 2013-05-02 11:55:02 · 656 阅读 · 0 评论 -
剑指offer面试题17合并两个有序的单链表之后还有序(递归)
#include#includeusing namespace std;struct Node{ int data; Node * next;};void PrintList(Node * head){ if(head==NULL) printf("empty List\n"); Node * p=head; while(p!=NU原创 2013-05-01 10:29:55 · 503 阅读 · 0 评论