最近参加了成都精灵云的笔试与面试,岗位是c++工程师。后面自己复盘了过程,笔试部分总结如下,希望能对各位相进该公司以及面试C++工程师的同学提供一些参考。后续也会陆续分享各公司的面试和笔试经验在该专栏,想看的可以关注一下博主!
笔试考了三道算法题,笔试形式为阅读题目,然后用中文给出算法思路,最后给出算法例程,分数各占一半,简单,中等,复杂各一道题
第一道题为简单题,给你一段字符串,以’.'结尾,要求你输出每句话单词呈相反顺序输出,但是每个字符串不一定只有一句话,可以有很多句话,输入类型为char *。例如:
输入:"I am a programmer."
输出:"programmer a am I."
该题目要注意的就是空格的处理,整体思路就是用栈先进后出的特性,找到’.'作为一句话的结尾,对这句话先处理,之后再处理下一句话,最后的结果拼接即可。
第二道题为中等题,给一个非递减排序的数列,找到指定的数并且该数的下标需要在原数列中最大。要求时间复杂度要在O(n)以下
很显然这道题已经排序了,并且规定了时间复杂度为O(n)以下,自然而然想到用二分查找,二分查找的时间复杂度为O(logn),小于O(n)。
但是要注意的是,在更新right下标的时候,不可以让right = mid - 1。因为已经保证了mid是不等于target的,但是无法保证mid-1是不等于target的。left可以是mid+1,因为我们要找的是最大下标。
在找到后,我们需要从该地方开始,向上查找到最后一个不等于target的下标,减一即可得到答案的结果,遍历的右边界为right,因为right是直接等于mid的,而我们已经保证了mid是不会等于target的,因此一定能找到一个不等于的值,不会陷入死循环。
第三道题是选做题,leetcode上的LRU缓存使用双向链表。