大众点评网笔试总结

来源:互联网 发布:mac rvm 安装ruby 慢 编辑:程序博客网 时间:2024/05/01 21:28

今天去大众点评网做笔试 题目不难 最后两题编程题相对百度估计就是头两道 可惜脑抽第一道写了个O(N^2)的算法 回来路上一想 其实很简单完全可以做成O(N) 回来赶紧写下来

题目是最大值为N的数列当中 找出所有和为N+1的数值对

拿到题目第一感觉就是两两相加,后来觉得肯定不行 于是做了点儿优化,即快排思路 分成大于(N+1)/2和小于(N+1)/2的 大致就是两个组遍历相加 但其实最后下来还是O(N^2)的时间复杂度。

其实问题在于遍历 不管上面的怎么优化 都是要扫描两遍 出来之后一想 完全可以把计算变为查找 因为查找算法完全可以做到LogN,如果N比较小可以放入内存 利用Bitmap或者哈希甚至可以做到线性算法 那么如何变计算为查找呢?

其实很简单 首先 这里利用bitmap 我们先建立一个含N个元素的位数组,遍历原数组,因为原数组没有元素重复 那么 将原数组中值对应在位数组中的值置为1,比如原数组中遍历到有5,则将位数组第五位置为1,最后我们可以得到一个原数组映射过来的位数组,即Bitmap,这个时间复杂度为O(N),然后再次遍历原数组,求遍历到得数组与N+1的差,然后在bitmap中寻找是否存在这个差,如果有,将该值下标和当前遍历到得值作为数值对存入结果集,比如遍历到10,那么我们在bitmap中查看N-10这个位置的二进制位是否为1,若是 则代表这两个数的和为N,这里就把遍历求和变为了寻找差,总结一下,构造bitmap时间复杂度是O(N),遍历数组求差然后在bitmap中寻找该值时间复杂度也是O(N),总结起来,最后的时间复杂度还是O(N)。

不得不说,考场上脑子总是有点儿抽,出来一想啥都有了,唉~

原创粉丝点击