《剑指offer》源码笔记

《剑指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 翻转&左旋转字符串

左旋转是两步:分段翻转,整体翻转

“`

你可能感兴趣的:(c++算法)