2017技术一面

8.26参加了360的技术面试,远程视频。
面试的大哥看起来还挺面善的,人也不错。
进入主题:
第一题:有两个单链表,但是在某个Node两个链表合一了,整体形状就类似拉链,最后一部分是两个链表共有的部分。需要求的是两个链表的交点。
最简单的当然是挨个看,时间复杂度是O(mn),m和n是两个链表的长度。
然后让我想一个更快的算法,我想的是可以把期中一个的链表的地址遍历出来,然后排序,再遍历另外的链表,每次折半查找,这样时间复杂度是O(nlogn).
面试官让我想个更快的,我没想出来。就说没想好。(其实可以使用hash表,这样时间复杂度是最低的,只需要O(m+n))。
然后面试官说,那咱们换个题目吧。
第二题:给你一个无序数组L,一个数字s,让你找出L中两个元素,这两个元素的和是s。
还是需要找到最快的算法。
还是最简单的蛮力算法,但是复杂度还是O(n^2).后来面试官提示说可以给你一些额外的空间,我就想可以使用hash表,这样时间复杂度就是O(n)
这题就算过了。
第三题:
这题是承接上一道题,问我hash表有几种结构,我就说一种是用hash function进行映射的,另外的一种就是红黑树。
然后问我,如果hash后的地址重复了怎么办,我记不太清了,就记着数据库当初讲过的一个概念,可以把之前的因子变大一倍,但是好像不要对,就和面试官说我记不清了。
然后就是第四题:
问我有没有使用过Linux以及Linux的版本号,我说我用的mac,而且平时也是远程连接学校服务器交作业,面试官就问我学校服务器的版本号,但是平时只是用用,没关注版本,所以也是不知道。
到此面试就结束了。

这次面试没有传说中的自我介绍,也没有最后让我问他什么问题之类的步骤。
感觉发挥的不咋地,也不造结果如何,不过总归是面试一回,把经历写出来,让其他朋友借鉴一下经验也是好的。

#360公司#
全部评论
第一题构建两个栈...将两个链表分别压栈,然后再对两个栈进行弹出比较操作....一直到两个栈弹出的元素不一样时,那前面一个弹出的那个值就是两个链表的交叉点..
点赞 回复
分享
发布于 2016-08-29 14:35
楼主是内推的什么岗啊? 试着看了下题目 第一题,记得左老师的书里有个关于链表相交的系列,楼主可以看一下。这个题目用一个指针先走两个链表长度差,然后再同时走,就可以找交点了。 第二题,如果允许额外空间的话,hash确实个好办法,全hash进后,遍历一遍看看有没有 和-差值 第三题,hash冲突检测?,拉链,开放地址
点赞 回复
分享
发布于 2016-08-28 11:45
博乐游戏
校招火热招聘中
官网直投
感谢分享哈。 第一道题好像要考虑链表是否有环,应该是要分情况讨论一下。第二道题我的思路是先排序一下,然后一个左指针从左边最小值开始,右指针从右边最大值开始,相加大于给定值s则右指针向左移动,相加小于给定值则左指针向右移动。
点赞 回复
分享
发布于 2016-08-28 11:48
第二道题先排序,然后使用两个指针从两端向中间逼近。或者就是散列。 hash 和红黑树是两个不同的概念。
点赞 回复
分享
发布于 2016-08-28 11:58
hash是hash map是map map是红黑树,数据有序,O(logN)的插入删除。 hash在C++是unordered_map,数据无需,O(1)的插入删除。 两个概念。 第一个题有无空间开销O(n)解法。。 祝好吧。。
点赞 回复
分享
发布于 2016-08-28 12:35
连续面三面了吗   没有连续面差不多就是挂了
点赞 回复
分享
发布于 2016-08-28 16:00
楼主hash和红黑树都没分清, 其次当面试说无序的时候,你第一想法是排序 排序后就是双下标往中间找
点赞 回复
分享
发布于 2016-08-28 16:08
第一道是剑指offer里边的37题,O(m+n)的思路是先计算两个链表的长度len1,len2,然后长链表先走|len1-len2|(绝对值)步,然后从两个链表开始遍历,比较两边的结点点是否相等,代码如下: public class Solution {     public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {    int len1=lenOfList(pHead1);         int len2=lenOfList(pHead2);                 ListNode current1=pHead1;         ListNode current2=pHead2;         int step=0;         if(len1>len2){             step=len1-len2;             while(step>0){                 current1=current1.next;                 step--;             }         }else{             step=len2-len1;             while(step>0){                 current2=current2.next;                 step--;             }         }                         while(current1!=current2){             current1=current1.next;             current2=current2.next;         }                 return current1;     }         public int lenOfList(ListNode pHead){         ListNode current=pHead;         int count=0;         while(current!=null){             count++;             current=current.next;         }                 return count;     } }
点赞 回复
分享
发布于 2016-08-28 17:27
第二题哈希表怎么搞
点赞 回复
分享
发布于 2016-08-28 21:29
......你这个想法很6哎....貌似也是线性时间0.0  就是空间稍微多了一点。  厉害厉害。
点赞 回复
分享
发布于 2016-08-29 14:37
第二题...如果能够排序的话..先对数组进行一次排序...这样时间复杂度就是nlogn...然后对排序好的数组设定头尾两个指针,将头尾两个指针所指的数加起来,如果这两个数的和加起来大于S,则右边指针往前移动,如果小于S,则左边指针往右移动...如果两个指针相遇了还没等于S,则说明不存在..不然肯定能找到这两个数..
点赞 回复
分享
发布于 2016-08-29 14:39
第三题...别人问的是Hash表的结构,应该问你的是冲突处理的方式,比如有链式的处理,就类似于hashmap,用数组+链表的实现...综上...楼主貌似三题都没有get到面试官的点啊...想通过一面,有点困难...
点赞 回复
分享
发布于 2016-08-29 14:43
楼主,求两个链表交点 用hash的方法做,怎么做啊
点赞 回复
分享
发布于 2016-08-30 22:00

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务