腾讯地图一面

2019/5/23 3:00北京腾讯地图一面

只想说,依旧是腾讯的风格,考的很深,与上次深圳不同的是,这次的大佬是做java的。。。。。。。。

最后我问了一个问题,这个问题我之前有和我同事也有讲过,可是都没有一下子能get到问题的重点,大佬就是nb啊

 

记录下问题。。。。

1介绍

2问我主编程语言,我说java和node?人家就说java吧,从这个时候我觉得我如果聪明的话就能立刻感知到的。。。。。java大佬。。。。。

3设计模式知道哪些?

我一直都是记不住啊。。。。。面试呗屡屡问到。。。。。

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

行为型模式,共十一种:策略模式模板方法模式观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

4多线程知道吧?用到锁?你说下你都知道啥锁

我说了表锁,行锁,乐观锁,悲观所,让我说乐观,悲观的区别?

乐观锁 :操作之前不上锁,

悲观锁:操作之前上锁

5java中有申请内存的概念嘛?怎么申请大块内存300兆。。。。

这道题,我在网上查了,没有明确的说法,说法和我的回答一样,java没有申请内存的概念,都是由虚拟机分配内存。。。

又何来的怎么申请大内存的呢?

哎,只能说一句,鹅厂吓人,估计人家对这个就有研究吧。。。。。。。

new int[300*1024*1024/4]

【更正】

之前我说的不对啊。我理解有误,其实任何高级语言都是去申请内存的向他的虚拟机,然后你申请,人家虚拟机去分配给你。。只是不同语言释放内存的机制不同而已,有的语言是虚拟机垃圾回收线程自动释放的,有的是需要手动释放的,

所以java当然可以申请内存了,申请300m内存当然可以申请了,。。。。

1024byte=1kbyte 1024kbyte=1mbyte 1024mbyte=1gbyte 

1024b=1kb 1024kb=1mb 1024mb=1g

long-8byte 300m=300*1024*1024byte

new long[300*1024*1024/8]就是申请300m内存了。。。。。

6进程间通信方式?

我答了四种:共享内存,socket,信号量,管道,他问我用过哪一种,我说socket,他又问我socket。。。完全懵逼。。。

7问一道题?txt文件中保存了100w个英文单词,以换行或者空格的方式分割,你说下怎么快速找出出现次数最多的前10个单词?

说下拟采用的数据结构还有算法吧。。。。。。hash&排序

解决问题思路,统计每个单词出现的频率,排序,找出。。。。。。。。。。。

写一个hash函数,对单词序列进行hash,进行计数,统计出现频率,之后排序?但是存在hash冲突啊。。。。。

http://www.lxway.com/4084220604.htm

统计一个文档中出现频率最多的k个单词的实现

这个问题我们应该经常会见到,想写这个问题是因为微软面试中,面试官问了这问题,而且要写代码,尼玛,最可恨的是不准用容器,哥当时就跪了。。。<T-T>

这个问题就是最常见的topK问题,解决思路:首先统计文档中所有不同word出现的频率,然后对所有不同的word按照出现频率排序,取出出现频率最大的k个words。

1.统计文档中所有不同word出现的频率

统计文档中word的频率的方法,要根据文档的数据量来决定:

(1)如果文档中数据能够全部读入内存,那么可以通过map/hashmap来直接统计各个word出现的频率。之所以采用map/hashmap结构,是因为它们的查找,修改效率很高,map在对数级别,hashmap在常数级别。

(2)如果文档中的word的数据不足以全部读入内存甚至远远超过了内存的容量,那只能通过分治的思想来解决,其中对于大数据比较好的解决办法:将这个文档通过hash(word)%n,hash到n个不同的小文件中,n根据文档的大小以及内存空间而定,hash后,所有相同的word肯定会在同一个文件中,然后分别对这n个文件分别利用map/hashmap来统计其中word的频率,分别求出topk,最后进行合并求总的topk。

2.求topk

当所有不同word的频率求出来之后,就是如何求出topk的问题了,抛开前面的条件,topk问题有很多解法:

(1)最简单的方法,冒泡或选择排序,求出最大的k个元素,时间复杂度在O(kn);

(2)基于快排的选择排序,在随机化的情况下,时间复杂度在O(n);

(3)局部淘汰法1,取前k个元素,建立一个数组,然后遍历所有元素,依次与数组中最小的元素比较,若大于,则替换。这种方法时间复杂度为O(kn);

(4)局部淘汰法2,取前k个元素,维护一个小根堆,遍历所有元素,依次与堆顶元素进行比较,若大于,则替换并重新使其为小根堆,这种方法的时间复杂度为O(nlgk)

(3)和(4)的最大的好处在于只需遍历一边序列就可以得到topk的结果,效率是很高的,还有就是在无法将序列全部加载到内存中时,这两种方法是最好的选择。

8你有啥问题,我问了接口限流怎么做?怎么控制一个接口的访问量?

人家直接就明白了我的意思,说了已经高并发下怎么降低负载是吧?所以啊,nb,一看就是实战过的大佬啊

大佬给出的解决方案是,明确服务端连接的个数,控制连接的个数,如果多了,则对新进来的请求进行拒绝,在一个要断开无效的坏的连接,总之人家的意思就是从传输层方面来控制负载,接口的访问量&并发量。。。

【我认为这个方案可行,因为控制住当前的连接数,其实就是在源头上控制了接口的访问量,记得之前限流的思想是从应用本身和接入本身,我认为限流最好还是做在接入本身比较好,因为从源头控制请求才是真正的卡住了脖子嘛。。。所以又回到了问题,就是控制并发连接数才是真的棒啊

【如何控制并发连接数】

1)明确一个概念,请求数!=连接数,请求>=连接(看是长连接/短连接,短连接:一次请求建一个连接,长连接:一次连接可处理多个请求.......

2)怎么查看nginx当前tcp连接数?(统计80端口的连接数。。。)

我用ai互动广告的服务试了下,开了三个浏览器url,显示tcp连接多了3个。。。。。

3)如何控制nginx的并发连接数?

配置一下nginx的配置文件就ok。。。。。。

9什么时候入职,能实习多长时间?

哎,都没戏了,还问啥?走个形式吧。。。。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值