<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
三位面试官,第一位是曾伯毅(CTO)。
1、反转字符串,例如"I am a student"转成"student a am I" ,不许使用字符串的高级方法和函数。
a、使用额外储存空间,一个stack。首先遍历求出字符串的长度,然后从末尾开始遍历,将单词push入栈,然后遇到空格后,将栈全部pop清空。
b、 定义两个函数,int length()和void reverse(),首先将所有字符反转,然后将倒序的单词反转。
这种方法不需要借助额外的空间,但是效率不如a高。
2、快速排序的partition函数
略
3、修改partition函数,将小于key,等于key和大于key的元素分开 (时间复杂度)
这个问题要考虑周全,无法在事先得知整个数组中有多少个等于key的元素,要保证出现多个等于key值的元素后,仍然可以正常终止循环。
4、二叉树的中序遍历
略
5、将二叉树的中序遍历的结果改为双向链表
加深对递归的理解,即先将整个二叉树从树抻成链,再将其与root结点相连。
6、 将一个双向链表倒转,返回倒转后的头结点,注意各种边界条件。
三个指针prv,cur和next。指定cur之后,判断prv和next的存在性。
还有电话面试的两道题
1、什么是多态?什么时候使用多态?
2、如何找到两个数组中的重复元素?
两种情况:有序数组和无序数组
有序:
两个指针直接比较遍历 O(n)
无序:
hashing算法 O(n)无需额外空间
字符统计counting 需要额外空间
本文是在Evernote上编辑的~