写在最前面
最近一直在找工作,一直看剑指offer,从里面主要学习到了剑指offer思考的方式,已经面试的一些技巧和注意的问题等等。下面是我对这本书的一下个人的总结。不喜勿喷啊!
面试能力与技巧
面试中应该掌握的是三方面的能力:编程语言、数据结构、算法!当然如果可以的话加上操作系统网络的知识会更好啦。
面试技巧:沟通能力、学习能力、知识迁移能力。
面试问题
1:赋值运算符
2:实现单例模式
public class Singleton {
private Singleton(){}
private static Object syncobj = new Object();
private static Singleton instanceSingleton;
public static Singleton getinSingleton(){
if(instanceSingleton == null){
synchronized (syncobj) {
if(instanceSingleton == null){//两次判断实现单例不然存在线程不安全
instanceSingleton = new Singleton();
}
}
}
return instanceSingleton;
}
}
3:二维数组中的查找(数组题)
4:替换空格(字符串题目)
5:从头到尾打印链表(链表题目)
解决方式:1:o(n*n)的暴力解决,2:借助辅助数据结构stack来解决。3:递归实现
6:重构二叉树(树)
递归实现数的遍历:
7:用两个栈实现队列
栈(先进后出)队列(先进先出)
8:旋转数组中的最小数字
二分查找的变形
9:斐波那契数列
递归,循环比较,通项公式。
应用:青蛙台阶跳问题。
10:二进制中1的个数
解答思路:一直往右移动和1做相与操作不能解决负数问题,负数陷入死循环。
和TMP做相与操作,tmp=1 && tmp<<1;产生的问题是每次都要移动二进制位数次,
和n&(n-1)
11:数值的整数次方
注意负数和0的情况,如果要快的话可用递归,16次方等于8次方的想乘这种思路。
12:打印1到N位数()
13:o(1)时间删除链表节点
14:调整数组顺序使奇数位于偶数前面。(快速排序的思想两个指针相互交换元素)
15:删除链表的倒数第K个节点(两个指针间隔K一个到底另外一个倒数第K个)。
16:反转链表。
三个指针。画图表示。
17:合并两个排序的链表
总结:边界值的检查(代码的鲁棒性一定要比较强)
解决面试题目的思路(画图、举例子)
19:镜像二叉树(递归。或者循环加栈)
20:顺序打印矩阵
21:包含min函数的栈(辅助栈每次压入新元素也要往里面压入最小的元素同时弹出也要考虑)
22:是否为弹出序列,弄一个栈来做判断。
23:从上往下打印二叉树(队列实现)
24:二叉搜索书的后续遍历序列
思路给定一个序列看是否是一颗树的后续遍历序列
25
26
27:二叉搜索树与双向链表的转化
28:字符串排列问题
29:数组中超过一半数字
30:最小的K个数(快速排序的思想会改变原数组元素,堆排序)
31:连续子数组的最大和(两个tmp)动态规划
32:从1到n整数1出现的次数
33:把数组排成最小的数
34丑数(因子只有2,.3,5)
a:直观法
b:空间换时间a方法不管是不是丑数都要计算
35:第一个只出现一次的字符
思路空间换时间
36:数组中的逆序对()
思路:归并排序的思想
37:两个链表的第一个公共节点()
空间换时间,栈来存储节点。
38数组在排序数组中出现的次数
快速排序找到第一个K和最后一个K相减
39:二叉树的深度,引申出判断一颗二叉树是否是平衡二叉树
思想:A递归求解。
是否是平衡二叉树可以用后序遍历。
40