这是我对自己蚂蚁金服前端一面的记录文章,整理出来的技术方面的知识点。如果有什么不对的地方,欢迎大家指出。

原文章地址

1. 快速排序

它的基本思想是

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。


首先是第一趟排序(第一次划分):
要把比第一个数49小的数放到这个49的左边,剩下的放到右边。
1、从右往左找比49小的数,第一个是27,然后27和49调换位置,
变成27、38、65、97、76、13、49、49
2、从左往右找比49大的数,第一个是65,然后65和49调换位置,
变成27、38、49、97、76、13、65、49
之后就是上面两步操作的循环,
变成27、38、13、97、76、49、65、49
变成27、38、13、49、76、97、65、49
第一趟排序完成

接着将数据分成49左边和49右边两个部分,分别对两个部分进行上述操作,先进行左边部分排序,
变成13、27、38、49、76、97、65、49
此时左边部分已经不能再继续分组了,也就是说左边部分排序完成

然后进行右边部分的排序,也是按照上述操作,
变成13、27、38、49、49、65、76、97
右边第一趟排序完成

之后的以此类推,
变成13、27、38、49、49、65、76、97
排序结束

2. 冒泡排序

它的基本思想是

重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序算法的原理如下:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

举例说明:6、3、8、2、9、1
第一趟排序:
1、6和3比较,6大于3,交换位置: 3 6 8 2 9 1
2、6和8比较,6小于8,不交换位置 3 6 8 2 9 1
3、8和2比较,8大于2,交换位置: 3 6 2 8 9 1
4、8和9比较,8小于9,不交换位置 3 6 2 8 9 1
5、9和1比较:9大于1,交换位置: 3 6 2 8 1 9
第一趟进行了5次比较, 排序结果: 3 6 2 8 1 9

第二趟排序:
1、3和6比较,3小于6,不交换位置 3 6 2 8 1 9
2、6和2比较,6大于2,交换位置: 3 2 6 8 1 9
3、6和8比较,6大于8,不交换位置 3 2 6 8 1 9
4、8和1比较,8大于1,交换位置: 3 2 6 1 8 9
第二趟进行了4次比较, 排序结果: 3 2 6 1 8 9

第三趟排序:
1、3和2比较,3大于2,交换位置: 2 3 6 1 8 9
2、3和6比较,3小于6,不交换位置 2 3 6 1 8 9
3、6和1比较,6大于1,交换位置: 2 3 1 6 8 9
第三趟进行了3次比较, 排序结果: 2 3 1 6 8 9

第四趟排序:
1、2和3比较,2小于3,不交换位置 2 3 1 6 8 9
2、3和1比较,3大于1,交换位置: 2 1 3 6 8 9
第四趟进行了2次比较, 排序结果: 2 1 3 6 8 9

第五趟排序:
1、2和1比较,2大于1,交换位置: 1 2 3 6 8 9
第五趟进行了1次比较, 排序结果: 1 2 3 6 8 9

最终结果:1 2 3 6 8 9

3.冒泡排序的(时间)复杂度

若 n 个数据的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 C 达到最小值:Cmin=n−1C_{min} = n-1Cmin​=n−1
所以,冒泡排序最好的时间复杂度为 O(n) 。

若 n 个数据是反序的,需要进行 n-1 趟排序。每趟排序要进行 n-i 次关键字的比较(1≤i≤n-1)。在这种情况下,比较次数 C 达到最大值:
Cmax=(n−1)+(n−2)+⋅⋅⋅+1=n(n−1)2=O(n2)C_{max} = (n-1) + (n-2) +···+1=\frac{n(n-1)}{2}=O(n^2) Cmax​=(n−1)+(n−2)+⋅⋅⋅+1=2n(n−1)​=O(n2)
所以,冒泡排序的最坏时间复杂度为 O(n^2) 。

综上,因此冒泡排序总的平均时间复杂度为 O(n^2) 。

4.二分查找

二分查找的查找过程:

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


首先找到数组最中间的数45(若最中间的数有两个,则取前面那一个),与目的数47比较,目的数较大,则进一步查找后半部分(47-99),中间数81与47比较,目的数较小,则查找前半部分(47-53),中间数47与47比较,与目的数相等,则查找成功。

5.广度遍历

广度遍历的基本思想:

1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。


访问顺序为:0,2,1,5,3,4
结果不是唯一的,只要满足“广度”的含义即可。

6.前序遍历

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

前序遍历结果:ABDECF

7.如何找到一个字符串里出现次数最多的字符

先创建一个对象去存储字符串里每个字符出现的次数,用对象的属性名key储存每个字符,用对象的属性值value储存对应字符的出现次数。例如第一个字符是1,则创建一个 ‘1’ : 1,第二个字符是2,则创建一个 ‘2’ : 1,若之后出现1,则 ‘1’ : 1+1。最后再比较那些属性值value的大小,然后反过来通过最大的那个value找出对应的key,找到对应的字符。
比较属性值value的大小的话,就是先遍历对象,把那些value一个个放到一个数组里,然后排序比较。
如果字符串里有特殊字符,例如制表符、换行符、中文、各种符号,可以试试用转义符斜杠 \ 或者用对应的编码。

8.取小数点后的第N位上的数字

例如取123.123456789的第5位,也就是5。

第一种方法:先把这个数转换为字符串,然后用正则表达式取出小数点后面的部分,即小数部分,再用 charAt() 方法取出第N位上的数字。

第二种方法:先把这个数转换为字符串,然后用 indexOf() 方法得到小数点的索引,也就是位置,再+N,就是第N位上数字的索引,再用 charAt() 方法取出第N位上的数字。

9.截取一个数的小数点后N位

有一个带有小数点的数,整数部分不清楚有多少位,要取到这个数的小数点后N位,也就是说后N位之后的部分直接舍去,不用四舍五入,输出前面的部分。例如取到123.123456789的后5位,就是舍去“6789”,输出123.12345。

第一种方法:把数字转换成字符串,再用正则表达式取出要求的数字

第二种方法:先把这个数转换为字符串,然后用正则表达式分别取出小数点前面和后面的部分,也就是分开整数部分和小数部分,然后用 substring() 方法取到前N位,再用 concat() 方法连接之前被取出的整数部分和处理之后的小数部分,得到结果。

第三种方法:把数字转换成字符串,然后用 indexOf() 方法得到小数点的索引,也就是位置,再+N,得到要求的数字加上整数部分、小数点一共多少位,然后用 substring() 方法取出要求的数字。

第四种方法:先用 toFixed() 方法(这个方法会四舍五入),得到要求的数字,然后用之前讲的方法得到小数点第N+1位的数字,通过这个数字是否大于4判断 toFixed() 方法有没“五入”进1,如果进1了再减去。

10.浏览器的同源策略

URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。相反,只要协议,域名,端口有任何一个的不同,就被当作是跨域。

浏览器采用同源策略,禁止页面加载或执行与自身来源不同的域的任何脚本。换句话说浏览器禁止的是来自不同源的"document"或脚本,对当前"document"读取或设置某些属性,也就是禁止从一个域的网页去请求另一个域的资源。

11.浏览器的事件模型


一个完整的JS事件流是从window开始,最后回到window的一个过程。
事件流被分为三个阶段(1~ 3)捕获过程、(3~ 4)目标过程、(4~ 7)冒泡过程。

12.比较对象是否相等

首先,用双等号 == 去比较对象是错误的,因为基本类型 string,number 通过值来比较,而对象通过指针指向的地址来做比较。也就是说双等号 == 比较的是地址(三等号 === 也是),如果比较的对象地址不同,无论使用" == “还是” === ",都返回false。
另外,如果想比较对象是否相等,要先考虑是想判断两个对象的属性是否相同,还是想判断属性对应的值是否相同,如果是判断属性的值是否相等,还要考虑值是否为对象的情况。
下面讲一个判断对象的值是否相等的方法(值不为对象)

function isObjectValueEqual(a, b) {   //取对象 a 和 b 的属性名var aProps = Object.getOwnPropertyNames(a);var bProps = Object.getOwnPropertyNames(b);//判断属性名的 length 是否一致if (aProps.length != bProps.length) {return false;}//循环取出属性名,再判断属性值是否一致for (var i = 0; i < aProps.length; i++) {var propName = aProps[i];if (a[propName] !== b[propName]) {return false;}}return true;
}

13.js的this指针

在JavaScript中,this指针是在创建函数时,由系统默认生成的两个隐式参数之一(另一个是arguments)。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。this指针指向与该函数调用进行隐式关联的一个对象,该对象被称为“函数上下文”(相当于函数的参数)。

this在js中主要有四种用法:
1、作为普通函数使用:this指针指向window对象。
2、作为对象方法来使用:this指针指向该方法的所有者(对象)。
3、call()和apply()方法调用:this指针指向call与apply方法指定的对象。
4、作为构造函数来使用:this指针指向new关键字创建的新对象。

14.CSS盒模型

盒模型分为标准盒模型和IE盒模型,盒模型由内容content、内边距padding、边框border和外边距margin组成。

标准盒模型:
元素的 width、height 只包含内容 content,不包含 border 和 padding 值;
盒子的大小由元素的宽高、边框和内边距决定。

IE盒模型:
元素的 width、height 不仅包括 content,还包括 border 和 padding;
盒子的大小取决于 width、height,修改 border 和 padding 值不能改变盒子的大小。

蚂蚁金服前端第一次电面(校招)笔记整理相关推荐

  1. 记蚂蚁金服前端第一次电面(校招)

    这是我结合蚂蚁金服前端一面的经历整理的一些笔记.如果有什么不对的地方,欢迎大家指出. 关于这次面试相关的技术方面的问题我整理在了另外一篇文章里 前面的问题主要是对整个人的了解,后面技术方面的问题会根据 ...

  2. 一位年薪 180 万的蚂蚁金服大佬扔给我的笔记,建议看完

    2021 终于迎来了夏天,去年一年,全世界都不安定,被疫情包围,渐渐治愈和免疫,国内虽然看着和往常没有多大的区别,但对于经济的冲击,不知道又倒退了多少年?大大小小的公司面临倒闭或已破产,对于职场上的我 ...

  3. 2022最新蚂蚁金服Java岗面试题库(整理版)

    前言 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目.笔者面的是阿里的Java研发工程师岗,面试流程是4轮技术面+1轮hr. 蚂蚁金服关于spring部分面试问题: 1.Spring ...

  4. 蚂蚁金服 java电话面_蚂蚁金服前端电话面试(一面)

    1. 自我介绍 2. 介绍项目相关:如何技术选型,遇到最大的问题,如何解决问题,哪个项目让我学到最多,印象最深刻之类的. 3. 性能优化有哪些原则措施,减少http请求为什么能提高性能?有没具体实践过 ...

  5. Java程序员春招三面蚂蚁金服,1200页文档笔记

    什么是Redis的持久化 我们知道Redis的数据都存储在内存中,如果服务器突然宕机,那么内存数据将会全部消失,为了防止这种情况出现,利用一套机制来保证数据不会因为故障而丢失,我们将这种机制称之为Re ...

  6. 支付宝蚂蚁金服是怎么把前端性能监控做到极致的?

    本文来自蚂蚁金服前端技术专家杨森在 ArchSummit 北京 2018 的分享,他将分享如何通过 Performance 相关的 API 准确的采集用户性能数据,并如何通过大数据计算加工最终产出用户 ...

  7. 阿里蚂蚁金服、蘑菇街、腾讯、去哪儿等实习面试

    说在前面的话 今天收到了自己满意的第一个offer也是第二个offer(第一个太low了不好意思说,BAT牛叉不在意,没赶上华为面试可惜了),每次面试都有收获,不愧于自己这段时间的小小努力.其实也没什 ...

  8. 蚂蚁金服组件 ReferenceError: primordials is not defined

    ReferenceError: primordials is not defined 错误经过 使用蚂蚁金服的某个第三方组件时,本地需要测试编译,执行 npm start 出现这个错误 Referen ...

  9. React 技术栈在蚂蚁金服的实践

    在2017在线技术峰会"阿里开源项目最佳实践"上,蚂蚁金服前端工程师崔晓斌为大家带来了"React 技术栈在蚂蚁金服的实践"的演讲.主要从研发的模式变迁开始说起 ...

最新文章

  1. UVALive 4318 Navy maneuvers
  2. document.getElementByName()的用法
  3. 【Node.js】http-server 实现目录浏览服务
  4. colab中的在Github中保存一份副本无法保存到自己github
  5. Linux禁用user01账户,Linux 管理用户 useradd
  6. python的实例类方法、修饰器类方法、修饰器保护方法、修饰器静态方法中私有属性的区别和自定义property的读写方法
  7. 【咀嚼C语言】二维数组找鞍点
  8. java文件字节流和文件字符流的使用
  9. redhat7.3 superset的离线安装
  10. Web 实现登录记住密码功能
  11. 树莓派USB摄像头使用
  12. 关于centos7重启报错:[sdb] Assuming drive cache: write through [sda] Assuming drive 解决如下
  13. dsp和通用计算机的区别,汽车dsp和功放区别
  14. 什么是Mixin?带你了解Vue中的Mixin混入
  15. maskrcnn-benchmark win10安装报错及解决方案
  16. 2022年9大顶级网络安全工具,有免费,有开源
  17. wps如何放大导航窗格字体
  18. STM32CubeMx 串口打印调试信息
  19. html代码复制繁体,JavaScript_简体中文转换繁体中文(实现代码),复制代码 代码如下:var Default_is - phpStudy...
  20. EAGLE 基本介绍

热门文章

  1. 173:vue+openlayers:解决国内openstreetmap地图加载不出来的问题(代码示例)
  2. DM365 linux内核文件系统的烧写步骤及其uboot参数配置
  3. 解决required a single bean, but 2 were found问题
  4. Base64与Bitmap转换
  5. 【Java】 SpringBoot - 零基础搭建并使用
  6. mysql 修改年龄_MYSQL——数据修改
  7. WCDMALTE Linux移远USB驱动程序用户指南(WCDMA/LTE Standard/Automotive/LTE-A Module Series)
  8. 不可注册为ActiveX控件
  9. (私人收藏)2019WER积木教育机器人赛(普及赛)解决方案-(全套)获取能源核心
  10. 怎么把idea中的项目上传到github上