又到了每年的金三银四招聘旺季,有幸获得了微软的笔试机会,程序猿们应该都知道,老美的公司都喜欢怼数据结构与算法,微软肯定也不例外,个人觉得考数据结构对每一个应聘者都公平,我这次投的是微软苏研院,笔试考察的不难,是最最常见的数据结构算法裸题,这里记录一下,也给出解法。

1 快速排序

快排应该是最网红的题了,从校招到社招,从后端到前端再到移动端,都会问,但是估计能手撕出来的不超过一半,能讲清楚思路的估计不超过一半的一半,其实用两个词概括,就是双指针+递归分治,在每一轮递归的时候找到每个基准数排完序后的位置,将小于这个基准数的所有数放到它的左边,将大于这个基准数的所有数放到它的右边,然后再分别递归它左边的数组与它右边的数组。比如说数组[2,3,1,5,6,4]:

初始状态是这样,我现在给两个指针出来,一个指针指向头,即arr[0] = 2, 一个指针指向尾,及arr[5] = 4,规定一个基准数,这里直接用第一个数(arr[0] = 2)即可。开始第一次的递归处理,尾指针先从右往左扫,扫到第一个小于(注意是小于,而不是小于等于哦)基准数的位置停住,这时候头指针再从左往右扫,扫到第一个大于基准数的位置停住,这时候是下面的图示状态:

交换两个指针所指的数,成为了下面的状态:

两个数交换完毕,右指针此时指的是arr[2] = 3, 左指针指着arr[1] = 1;交换完毕后右指针继续从当前位置往左扫,扫到1的时候发现和左指针相遇了,那么这个时候就结束左右指针的扫描,左右指针同时指着arr[1] = 1,即:

此时退出循环扫描的过程,交换基准数与左右指针同时所指的数的位置,开头说了,基准数我选择的是arr[0] = 2, 指针指的是arr[1] = 1; 交换过后就变成了:

这时候就发现基准数已经出现在了它排完序后应该在的位置(排完序后是[1,2,3,4,5,6],2出现在了第2位),比这个基准数小的数组出现在了它的左边([1]出现在了2的左边),比基准数大的出现在了它的右边([3,5,6,4]出现在了2的右边)。之后的过程就是对左右数组的分别递归处理。附上代码:

    function quickSort(arr, begin, end) {//递归出口if(begin >= end)return;var l = begin; // 左指针var r = end; //右指针var temp = arr[begin]; //基准数,这里取数组第一个数//左右指针相遇的时候退出扫描循环while(l < r) {//右指针从右向左扫描,碰到第一个小于基准数的时候停住while(l < r && arr[r] >= temp)r --;//左指针从左向右扫描,碰到第一个大于基准数的时候停住while(l < r && arr[l] <= temp)l ++;//交换左右指针所停位置的数[arr[l], arr[r]] = [arr[r], arr[l]];}//最后交换基准数与指针相遇位置的数[arr[begin], arr[l]] = [arr[l], arr[begin]];//递归处理左右数组quickSort(arr, begin, l - 1);quickSort(arr, l + 1, end);}var arr = [2,3,4,1,5,6]quickSort(arr, 0, 5);console.log(arr)

思考:为什么是右指针先扫而不是左指针先扫呢,大家自己想想吧哈哈,模拟一下就知道了。 发散性思考
上文中我提到了左数组,右数组,还提到了基准数的概念,其中,左数组中的所有值都小于基准数,右数组中的所有值都大于基准数,而且快排还是个递归的过程。我这里如果做一下类比,如果我把基准数看成是树根,把左数组看成是根的左孩子,右数组看成是根的右孩子,相信学过数据结构的童鞋都知道了,那不就是一颗BST吗。哈哈确实如此,其实你会发现BST的中序遍历出来就是一个有序数组,所以上文中快排的过程就是一个创建二叉搜索树的过程。
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树.
所以要是问你怎么创建一颗BST,想必也能信手拈来了吧,废话不说上代码:

     function vNode(value) {this.val = value;this.left = this.right = null;}function createBST(arr) {var len = arr.length;if(len < 1)return;var l = 0;var r = len - 1;var temp = arr[0];while(l < r) {while(l < r && arr[r] >= temp)r --;while(l < r && arr[l] <= temp)l ++;[arr[l], arr[r]] = [arr[r], arr[l]];}[arr[0], arr[l]] = [arr[l], arr[0]];var root = new vNode(arr[l]);root.left = createBST(arr.slice(0, l));root.right = createBST(arr.slice(l + 1));return root;}

二叉树的非递归中序遍历

我相信很多人都能写出二叉树的递归遍历:递归遍历左子树,输出根节点,递归遍历右子树,三行代码,完事,但是要问到非递归遍历,估计大多数人就傻眼了,但是人家就要考你不会的啊,非递归遍历其实就是借助栈来完成:

var inorderTraversal = function(root) {const res = [];const stack = [];while(root||stack.length !== 0){while(root){stack.push(root);root=root.left;}if(stack.length){let p=stack[stack.length - 1];res.push(p.val);stack.pop();root = p.right;}}  return res;
};

老美的公司,算法关必须过啊。所以,路漫漫其修远兮,刷题刷题多刷题吧

原作者姓名:白落梅
原出处:掘金
原文链接:微软前端社招笔试详解 - 掘金

前端笔试能查吗_微软前端社招笔试详解相关推荐

  1. 前端跨域的理解和解决跨域的方案详解(全)

    作为前端开发,我们遇到最多的应该就是跨域问题,对于萌新来说,跨域就是一道墙,不知所措,其实只要理解了跨域的含义和原理,解决它是不难的,今天给大家介绍下什么是跨域和跨域的解决方案! 什么是跨域? 跨域是 ...

  2. 安卓市场和安智市场_安卓市场小米市场ASO详解

    本文由鸟哥笔记春羽计划出品 本文2003字 今天我们要讲的是小米应用市场从0-1的获量的过程,小米市场如何在应用市场通过ASO获得大量的流量呢?下面有这几点. 量词分析 进行应用市场带量词分析,组建自 ...

  3. apache伪静态把css 排除掉_(02)CSS 选择器详解 | CSS

    原创:itsOli @前端一万小时 本文版权归作者所有,未经授权,请勿转载! 本文节选自"语雀"私有付费专栏「前端一万小时 | 从零基础到轻松就业」 1. 伪类选择器有哪些?2. ...

  4. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

  5. find linux 目录深度_浪里淘沙,详解Linux系统中Find命令的实用技巧

    知了小巷:浪里淘沙,详解Linux系统中Find命令的实用技巧. 啊哈,找到了! 当我们需要在Linux系统上定位某个文件或目录时,find命令通常是必备之选. 它使用起来非常简单,但有许多不同的可选 ...

  6. java判断颜色合法_判断颜色是否合法的正则表达式(详解)

    判断颜色是否合法的正则表达式(详解) "^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$"; 意思是:以#开头,后面是数字和a-f的字符(大写或小写),这个值是 ...

  7. 苹果 谷歌 微软 三国混战 附地图详解

    导读:据Gizmodo报道,令人吃惊的并不是微软或者苹果的规模,他们有几十年的历史,打造了行业的巨擘(现在又一致困在时空隧道里),真正令人吃惊的是Google.在十几年时间里,Google一举成为网络 ...

  8. 四种形态图解_中纪委”四种形态“指标体系详解

    中纪委"四种形态"指标体系详解 中纪委自提出"四种形态"以来,官方.民间一直对"四种 形态"各包含什么内容, 在具体实践中如何应用, 存在较 ...

  9. python处理nc数据_利用python如何处理nc数据详解

    利用python如何处理nc数据详解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  利用python如何处理nc数据详解.txt ] (友情提示:右键点上行txt ...

  10. 2020京东社招笔试编程题-数据分析岗

    一个朋友参加的2020京东社招数据分析岗的笔试,有两道编程题.留了第一题,大意就是根据每日限制如何出售股票使得总亏损最少. import math while 1:nm=list(map(int,in ...

最新文章

  1. CDN和Web Cache领域相关的经典书籍推荐
  2. 数据结构 - 递归 回溯算法(八皇后问题)
  3. Eclipse如何导入第三方jar包
  4. Transactional ejb 事务陷阱
  5. 用python找出所有三位数中的水仙花数_python使用循环打印所有三位数水仙花数的实例...
  6. 3.memcached的基本命令
  7. Supporting hyperplane
  8. SAS: PROC IMPORT简单入门介绍
  9. oracle 新增配额,Oracle 用户配额
  10. Microsoft Project 2010 设置子任务
  11. 常用小波基函数以及多尺度多分辨率的理解
  12. 【Linux】之【网络】相关的命令及解析[ethtool、nload、nethogs、iftop、iptraf、ifstat]
  13. 宝塔BT面板无法启动修复方法
  14. 毕业设计房屋出租研究现状
  15. 【Web编程实践课第二次作业】体育新闻世界
  16. 圣诞节前做好这些能让订单翻倍!另附各国圣诞放假时间表
  17. 暑假到了,如何有效保护眼睛?盘点保护视力的护眼台灯
  18. Word里面如何修图
  19. 学习PCL库需要知道哪些知识?
  20. 知网查重提交论文显示服务器错误,知网查重怎么会提交失败

热门文章

  1. Flutter 深度学习 — 动画(补间动画、Hero动画、交错动画)
  2. Android 自定义View(三)
  3. 压缩下载到浏览器的工具类
  4. 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
  5. 神经网络模型压缩优化方法
  6. 读书笔记(chapter18)
  7. php 非常简单的导入sql文件
  8. USACO 4.3.1 Buy Low, Buy Lower
  9. web安全day30:人人都要懂的LAMP--apache服务安装和配置
  10. web安全day9:5个实验实实在在学习windows域部署