算法题1
找出字符串中连续出现最多的字符和个数
1 | 'abcaakjbb' => {'a':2,'b':2} |
1 | var str = 'abbkejsbcccwqaa'; |
算法题2
统计 1 ~ n 整数中出现 1的次数(有多少个1)
1 | <script> |
算法题3
如何将 [{id: 1}, {id: 2, pId: 1}, …] 的重复数组(有重复数据)转成树形结构的数组 [{id: 1, child: [{id: 2, pId: 1}]}, …] (需要去重)
1 | /* |
算法题4
在一个字符串数组中有红、黄、蓝三种颜色的球,且个数不相等、顺序不一致,请为该数组排序。使得排序后数组中球的顺序为:黄、红、蓝。
例如:红蓝蓝黄红黄蓝红红黄红,排序后为:黄黄黄红红红红红蓝蓝蓝。
1 | let temp1 = [...'红蓝蓝黄红黄蓝红红黄红'].reduce((a, b) => { |
1 | function sort(arr) { |
2道由百度搜索图片想到的面试题
再百度图片里搜索美女
二子
在百度搜索图片中,可以看到页面两端对齐,是典型的瀑布流布局,只不过高度固定,
当缩放浏览器是,可以看到实现的并不完美:
下面用flex实现该效果,主要使用flex-grow: 1
和object-fit: cover
:
1 |
|
1 | #baguetteBox-overlay { |
判断鼠标移入移出元素时的方向
悬浮图片上,判断鼠标移动方向
实现思路
1 |
|
谈谈对BigPipe的理解
BigPipe并不是适用于所有的场合
BigPipe并不是适用于所有的场合,类似于Facebook和微博,他主要适用于:
- 第一个请求时间较长,后端程序需要读取多个API
- 页面上的劢态内容可以划分在多个区块内显示,且各个区块之间的关系不大(极弱耦合)
- SEO需求较弱
BigPipe 是 Facebook 开发的优化网页加载速度的技术。网上几乎没有用 node.js 实现的文章,实际上,不止于 node.js,BigPipe 用其他语言的实现在网上都很少见。
以至于这技术出现很久以后,我还以为就是整个网页的框架先发送完毕后,用另一个或几个 ajax 请求再请求页面内的模块。
直到不久前,我才了解到原来 BigPipe 的核心概念就是只用一个 HTTP 请求,只是页面元素不按顺序发送而已。
传统web模式采用了顺序处理的流程来处理用户请求.即用户向客户端发送一个请求后,服务器处理请求,加载数据并渲染页面;最后将页面返回给客户端.整个过程是串行执行的,具体流程如下:
- 浏览器发送一个HTTP请求到Web服务器。
- Web服务器解析请求,然后读取数据存储层,制定一个HTML文件,并用一个HTTP响应把它发送到客户端。
- HTTP响应通过互联网传送到浏览器。
- 浏览器解析Web服务器的响应,使用HTML文件构建了一个的DOM树,并且下载引用的CSS和JavaScript文件。
- CSS资源下载后,浏览器解析它们,并将它们应用到DOM树。
- JavaScript资源下载后,浏览器解析并执行它们。
整个流程按必须顺序执行,不能重叠,这也是为什么传统模式随着网络速度的提升访问速度没有很大提升的原因.
解决顺序执行的速度问题,一般能想到的就是多线程并发执行.Facebook 的前端性能研究小组采用浏览器和服务端并发执行的思路,经过了六个月的努力,开发出了BigPipe页面异步加载技术,成功的将个人空间主页面加载耗时由原来的5 秒减少为现在的2.5 秒。
BigPipe设计原理
BigPipe的主要思想是实现浏览器和服务器的并发执行,实现页面的异步加载从而提高页面加载速度.
为了达到这个目的,BigPipe首先根据页面的功能或位置将一个页面分成若干模块(模块称作pagelet),并对这几个模块进行标识.举个例子,在博客园个人首页包括几大板块,如头部信息,左边信息,博文列表,footer等.我们可以将首页按这些功能分块,并用唯一id或名称标识pagelet.客户端向服务端发送请求后(发出一次访问请求,如请求访问个人博客首页),服务端采用并发形式获取各个pagelet的数据并渲染pagelet的页面效果.一旦某个pagelet页面渲染完成则立刻采用json形式将该pagelet页面显示结果返回给客户端.客户端浏览器会根据pagelet的id或标识符,在页面的制定区域对pagelet进行转载渲染.客户端的模块加载采用js技术.具体流程如下:
- 请求解析:Web服务器解析和完整性检查的HTTP请求。
- 数据获取:Web服务器从存储层获取数据。
- 标记生成:Web服务器生成的响应的HTML标记。
- 网络传输:响应从Web服务器传送到浏览器。
- CSS的下载:浏览器下载网页的CSS的要求。
- DOM树结构和CSS样式:浏览器构造的DOM文档树,然后应用它的CSS规则。
- JavaScript中下载:浏览器下载网页中JavaScript引用的资源。
- JavaScript执行:浏览器的网页执行JavaScript代码
前三个阶段由Web服务器执行,最后四个阶段(5,6,7,8)是由浏览器执行。所以在服务器可以采用多线程并发方式对每个pagelet进行数据获取和标记生成页面,生成好的pagelet页面发送给前端.同时在浏览器端,对css,js的下载可以采用并行化处理.这就达到了浏览器和服务器的并发执行的效果,这样使得多个流程可以叠加执行,加少了整体页面的加载时间.浏览器端的并行化交给浏览器自己处理不需要我们做额外工作.在BigPipe中主要是处理服务端的并行性.
在BigPipe,一个用户请求的生命周期是这样的:在浏览器发送一个HTTP请求到Web服务器。在收到的HTTP请求,并在上面进行一些全面的检查, 网站服务器立即发回一个未关闭的HTML文件,其中包括一个HTML 标签和标签的开始标签。标签包括BigPipe的JavaScript库来解析Pagelet以后收到的答复。在标签,有一个模板,它指定了页面的逻辑结构和Pagelets占位符。