《剑指offer》源码笔记
本篇针对源码问题感想。
没写代码的面试题
- 面试题 1 c++语言赋值(需要返回引用等等)
- 面试题 2 singleton模式,不熟
- 面试题 6 中序前序树查找,繁琐
- 面试题 8 旋转数组,单纯省时间
- 面试题 20 顺时针打印矩阵 边界问题
- 面试题 22 栈的压入、弹出序列
- 面试题 26 复杂链表的复制,代码很简单,思路重要
- 面试题 32 从1到n整数1出现的次数 主要是数学上的规律,代码不重要
- 面试题 33 数组排成最小的数 数学定义规则,并不是很懂。感觉上像是动态规划
- 面试题 36 数组中逆序对。 比较麻烦,递归调用,段内逆序,排序,段间
- 面试题 37 两个链表第一个公共结点 比较简单
某些题的感想
面试题7 两个stack维护queue
- 源码中没有看到维护stack1中原queue的操作:
while (!stack2.empty())
{
T& element = stack2.top();
stack2.pop();
stack1.push(element);
}
- 源码中返回的是删除之后的队列头,应该是删除之后剩下的
T head = stack2.top();
stack2.pop();
感觉这两步操作顺序应该是反过来的。
面试题13 删除链表结点
vs2013版本运行报错,360默认为木马,可能是对指针的某些操作使得360智障了。
添加信任白名单。
添加iostream,pause
面试题15 第k个结点
递归可做
面试题30 最小的k个数
快排思想利用Partition想法的复杂度为O(n)原因如下:
Partition的复杂度为O(n),然后需要做有限次即可,所以总体还是O(n)。
但是当运气比较差的时候也是快排运气最差的时候。
面试题34 丑数
可以维护三个队列M2,M3,M5来存储每个丑数乘以2,3,5的值,然后不断找每个队列中的最小值。找到丑数数列。
面试题43 n个骰子的点数
可以用动态规划:f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)
f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1
http://blog.csdn.net/yusiguyuan/article/details/41048299
特殊思路
面试题10 二进制中1的个数
位运算:整数-1,再和原整数做与运算会把最右边一个1变成0。
面试题11 数值的整次乘方
- 等于 equal是要近似的文中给的±0.0000001
- 位运算代替乘除2
面试题14 调整数组顺序使奇数位于偶数之前
函数打包:
void ReorderOddEven_2(int *pData, unsigned int length)
{
Reorder(pData, length, isEven);
}
void Reorder(int *pData, unsigned int length, bool (*func)(int))
{
...
}
bool isEven(int n)
{
return (n & 1) == 0;
}
面试题40 数组中只出现一次的数字
数组一直做异或,两个相同的数字就变成0了
面试题41 和为s的两个数vs整数序列
整数序列和两个数类似,两个数为两侧收缩,序列为两个标志范围内序列,为一侧伸缩
面试题42 翻转&左旋转字符串
左旋转是两步:分段翻转,整体翻转
“`