新冠疫情慢慢消退,各行各业裁员跳槽大洗牌,为了收割满意的offer,每天不得不逼着自己天天刷题。下面是来自阿里的面试题,希望可以帮到你。

例1

实现一个 normalize 函数,能将输入的特定的字符串转化为特定的结构化数据。

符串仅由小写字母和[,]组成,且字符串不会包含多余的空格。
示例一: 'abc' --> {value: 'abc'}
示例二:'[abc[bcd[def]]]' -> {value: 'abc', children: {value: 'bcd', children: {value: 'def'}}}

通过栈可以用来判断一个表达式中括号是否匹配。栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部。数组专门提供了 push() 和 pop() 方法,以便实现类似栈的行为。

function todo(str) {let s = [];let list = [];let obj = {}for (let i = 0; i < str.length; i++) {let value = str[i]switch (value) {case '[':s.push({ index: i, value: '[' })break;case ']':let last = s.pop();list.unshift([last.index, i])default:break;}}let [start, end] = list[0]let parent = objfor (let i = 1; i < list.length; i++) {let [a, b] = list[i];let result = str.slice(start + 1, a) + str.slice(b + 1, end);start = a;end = b;parent.value = result;parent.children = {};parent = parent.children;}let [x, y] = list[list.length - 1]parent.value = str.slice(x + 1, y)return obj
}

例2

实现一个事件收发器 Event 类,继承自此类的对象拥有 on,off,once 和 trigger 方法。

// 例如
const event = new Event();
function log(val) {console.log(val);};
event.on('foo_event', log);
event.trigger('foo_event', 'abc'); // 打印出 abc
event.off('foo_event', log);
event.trigger('foo_event', 'abc'); // 打印出 undefined

这个是Node中的events模块里面的知识,直接上源码。(发布订阅模式大家一定要掌握,这是非常常见的设计模式!)

function checkListener(listener) {if (typeof listener !== 'function') {throw new Error('listener', 'Function', listener);}
}function spliceOne(list, index) {for (; index + 1 < list.length; index++)list[index] = list[index + 1];list.pop();
}function EventEmitter() {EventEmitter.init.call(this)
}EventEmitter.prototype._events = undefined
EventEmitter.prototype._eventsCount = 0;EventEmitter.init = function () {if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {this._events = Object.create(null)this._eventsCount = 0;}
}function _addListener(target, type, listener) {let events;let exiting;checkListener(listener)events = target._eventsif (events === undefined) {events = target._events = Object.create(null)target._eventsCount = 0;} else {exiting = events[type]}if (exiting === undefined) {events[type] = listener;++target._eventsCount;} else {if (typeof exiting === 'function') {exiting = events[type] = [exiting, listener]} else {exiting.push(listener)}}return target
}EventEmitter.prototype.addListener = function addListener(type, listener) {return _addListener(this, type, listener)
}EventEmitter.prototype.on = EventEmitter.prototype.addListener;EventEmitter.prototype.removeListener = function removeListener (type, listener) {let list;let events;checkListener(listener)events = this._events;if (events === undefined) {return this;}list = events[type]if (list === undefined) {return this;}if (list === listener || list.listener === listener) {if (--this._eventsCount === 0) {this._events = Object.create(null)} else {delete events[type];}}
}EventEmitter.prototype.off = EventEmitter.prototype.removeListenerEventEmitter.prototype.trigger = function trigger(type, ...args) {const events = this._events;const handler = events[type]if (handler === undefined) {console.log(undefined)return false;}if (typeof handler === 'function') {Reflect.apply(handler, this, args)} else {const len = handler.length;const listeners = arrayClone(handler, len);for (let i = 0; i < len; i++) {Reflect.apply(listeners[i], this, args)}}return true
}function arrayClone(arr, n) {var copy = new Array(n);for (var i = 0; i < n; ++i)copy[i] = arr[i];return copy;
}function _onceWrap(target, type, listener) {let state = { fired: false, wrapFn: undefined, target, type, listener }var wrapped = onceWrapper.bind(state);wrapped.listener = listener;state.wrapFn = wrapped;return wrapped
}function onceWrapper(...args) {if (!this.fired) {this.target.removeListener(this.type, this.wrapFn);this.fired = true;Reflect.apply(this.listener, this.target, args)}
}EventEmitter.prototype.once = function once(type, listener) {checkListener(listener)this.on(type, _onceWrap(this, type, listener))return this
}

例3

实现一个 DOM 事件代理方法 delegate,接收一个 dom 元素,有两个方法,分别是添加 on 和 off。

// 例如
delegate(parentElement).on('.childClassname', 'click', callback);
delegate(parentElement).off('.childClassname', 'click', callback);

这里考察事件委托,如果你了解React合成事件原理,把事件都代理到document中,那么你很容易写出来。

function delegate(parentElement) {function on(childClassname, eventType, listener) {let list = parentElement.querySelectorAll(childClassname)Array.from(list, (dom) => {let eventStore = dom.eventStore || (dom.eventStore = {})eventStore[eventType] = listener;})document.addEventListener(eventType, dispatchEvent, false)}function dispatchEvent(event) {let { type, target } = eventlet eventType = type;while (target) {let { eventStore } = target;let listener = eventStore && eventStore[eventType]if (listener) {listener.call(target, event)}target = target.parentNode;}}function off(childClassname, eventType, listener) {let list = parentElement.querySelectorAll(childClassname)Array.from(list, (dom) => {let eventStore = dom.eventStorelet listener = eventStore && eventStore[eventType]if (listener) {eventStore[eventType] = null}})}return { on, off }
}

解决问题方式多种多样,答案仅供参考,欢迎在评论区留言,说说你对题目的看法。

你以为内容就结束了吗?不,我不仅要告诉你答案,我还要内推,就是这么豪横!

有人想去阿里淘系技术部吗?负责手淘业务,技术是非常有挑战,现在可以内推,简历发送至 pengli.wpl@alibaba-inc.com,如果合适会当天与你联系,处理速度非常快,赶快加入我们吧!!!。

详细内容请看这篇文章介绍:阿里巴巴内推

阿里面试题(含内推)相关推荐

  1. 阿里秋招面试全解析(含内推岗)

    每个技术人都有个大厂梦,我觉得这很正常,并不是饭后的谈资而是每个技术人的追求.像阿里.腾讯.美团.字节跳动.京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/小公司,如果说能够在这样的公司锻 ...

  2. 海康威视2022面经(含内推码)

    2022届春招,2023届实习,最新内推码:3J97UQ 欢迎大家投递海康威视!!! 以下面试的是技术支持岗 一共两轮,技术面和HR面,十分庆幸没有群面,最担心的就是群面,否则自己准备的东西就全部无用 ...

  3. 【含内推码】字节跳动智能创作2022秋招提前批全面开启!

    关注公众号,获取更多AI领域发展机会 01 团队介绍 智能创作团队是字节跳动AI&多媒体技术中台,在计算机视觉.音视频拍摄编辑.特效处理.语音等角度支持抖音.TikTok.剪映.西瓜等公司内众 ...

  4. python内推群_重要!!!陌陌2020校招Python内推通道(含内推直链)

    陌陌校招正式开启,今天给大家来一份陌陌2020的校招内推. 本次陌陌内推的对象为 2020 届毕业的全日制本科.硕士.博士在校生,有意向去陌陌的各位可以努力一把了. 内推简历通过简历筛选后免笔试,直接 ...

  5. 内推 | 旷视研究院深度学习实习生招聘(含内推邮箱)

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :旷视 [人工智能资源(书籍 ...

  6. Datawhale 内推 | 头条、百度、网易、滴滴、联想、商汤、平安科技等

    又到了"金九银十",大家为找工作忐忑不安,跃跃欲试的时节. 为了帮助准备就业或者实习的同学找到心仪的单位,Datawhale联合实习僧为大家带来秋招专场,涵盖了可转正专区.算法大师 ...

  7. 360集团2016JAVA研发工程师内推笔试题

    360集团2016JAVA研发工程师内推笔试题 题目来源:牛客网 https://www.nowcoder.com/test/question/analytic?tid=21122281 1.执行以下 ...

  8. 2017年搜狐内推 面试题——谈谈面试中的算法

    转自:2017年搜狐内推 面试题--谈谈面试中的算法,保存在此以学习. 第一题:给你一个数组,其中有一个元素的个数大于数组总个数的一半,求出这个元素. 该同学的给出了方法一:先对数组排序,然后找到中间 ...

  9. 面试王者的出装方案推荐——软技能篇(文末含岗位内推)

    前言 金三银四的求职季已经过半,但求职者的简历依然络绎不绝地涌过来.今年的大形势比较丧,不少大公司需要通过裁员降薪,或着停止招新,来 "过冬". 所以,哪怕是有招聘需求的岗位,也会 ...

最新文章

  1. 如何清除Git中的本地工作目录? [重复]
  2. Java常用集合体系以及相互区别
  3. linux 下软READ 的使用和参数 以及 实现虚拟READ步骤
  4. 计算机桌面怎么换服,电脑管家桌面整理怎么更换电脑壁纸?
  5. 返回一个一维整数数组中最大子数组的和
  6. Hadoop生态圈-Azkaban实现文件上传到hdfs并执行MR数据清洗
  7. 语料库mysql_国内语料库建设一览表
  8. 软件测试jmeter面试问题,jmeter 面试题剖析实战
  9. 盘点App测试会用到哪些工具
  10. python计算三角形斜边上的中线_直角三角形斜边上的中线的性质及其应用
  11. sai钢笔图层怎么移动某条线?
  12. 针对于win8、win10无法访问,您可能没有权限使用网络资源的解决方法
  13. FLASH,宣传画册,翻书效果
  14. 校园饭卡充值系统服务器配置,信息化建设管理中心
  15. db2 如何 将 oracle CONNECT BY 移植到 DB2
  16. 2021年 第一个月的福利 程序员免费资源!
  17. lua的垃圾回收机制
  18. 表示学习的挑战:三场机器学习竞赛报告Challenges in Representation Learning: A report on three machine learning contests
  19. NLP-生成模型-2016:CopyNet【Copy机制赋予seq2seq模型从源文本中复制词汇的能力,解决Decoder的OOV问题】
  20. 0905 关于某宝购物车

热门文章

  1. 利用 jwt 可以获取用户的额外信息?
  2. ​网易首支 AI 生成歌曲《醒来》正式发布;FSF :苹果 OCSP 事故在道德上不可接受;CentOS 8.3 发布|极客头条...
  3. JDK 15 正式发布,划时代的 ZGC 同时宣布转正!
  4. 数据说话!UCloud「硬刚」腾讯云,高性能 AMD 云主机哪家强?
  5. JDK 14 调试神器了解一下?| 原力计划
  6. 5G手机江湖:一场卡位战,一位“关键先生”,一个“王者”
  7. 设计即开发,如何打通软件研发的“任督二脉”?
  8. 5G 时代连接 70 亿人,安全如何保障?
  9. Mozilla 重磅推出物联网平台 WebThings!| 极客头条
  10. TensorFlow 支持 Unicode,中文 NLP 终于省心了