记一次面试题

本贴最后更新于 1890 天前,其中的信息可能已经时移世易

从事前端开发一年半,下面是我做的一份面试题,分享一下,
希望大家指出我实现过程中的不足。

/**

extensions is an Array and each item has such format:

{firstName: 'xxx', lastName: 'xxx', ext: 'xxx', extType: 'xxx'}

lastName, ext can be empty, extType can only has "DigitalUser", "VirtualUser","FaxUser","Dept","AO".

**/

  

/**

Question 1: sort extensions by "firstName" + "lastName" + "ext" ASC

**/

function sortExtensionsByName(extensions) {

    // reserved the type of sort

    let type = String(arguments[1]).toLowerCase() ===  'desc'  ?  'desc'  :  'asc';

  

    if (Array.isArray(extensions)) {

        extensions.sort(function(a, b) {

            let firstLength = Math.max(a.firstName.length, b.firstName.length),

                 lastLength = Math.max((a.lastName ||  '').length, (b.lastName ||  '').length),

                 extLength = Math.max((a.ext ||  '').length, (b.ext ||  '').length),

                 aStr,

                 bStr;

  

          aStr = a.firstName.padEnd(firstLength, ' ') + (a.lastName ||  '').padEnd(lastLength, ' ') + (a.ext ||  '').padEnd(extLength, ' '),

bStr = b.firstName.padEnd(firstLength, ' ') + (b.lastName ||  '').padEnd(lastLength, ' ') + (b.ext ||  '').padEnd(extLength, ' ');

return type ===  'asc'  ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);

          });

    } else {

        console.log("error: The first parameter should be an Array, e.g., [{firstName: 'xxx', lastName: 'xxx', ext: 'xxx', extType: 'xxx'}]");

    }

}

  
  

/**

Question 2: sort extensions by extType follow these orders ASC

DigitalUser < VirtualUser < FaxUser < AO < Dept.

**/

function sortExtensionsByExtType(extensions) {

    // reserved the type of sort

    let type = String(arguments[1]).toLowerCase() ===  'desc'  ?  'desc'  :  'asc',

         sortObj = {

             'Dept': 0,

             'AO': 1,

             'FaxUser': 2,

             'VirtualUser': 3,

             'DigitalUser': 4

         };

    if (Array.isArray(extensions)) {

        extensions.sort(function(a, b) {

            let aNum = sortObj[a.extType],

                 bNum = sortObj[b.extType];

            return type ===  'asc'  ? aNum - bNum : bNum - aNum;

        });

    } else {

        console.log("error: The first parameter should be an Array, e.g., [{firstName: 'xxx', lastName: 'xxx', ext: 'xxx', extType: 'xxx'}]");

    }

}

  
  

/**

saleItems is an Array has each item has such format:

{

  month: n, //[1-12],

  date: n, //[1-31],

  transationId: "xxx",

  salePrice: number

}

**/

  

/**

Question 3: write a function to calculate and return a list of total sales (sum) for each quarter, expected result like:

[

  {quarter: 1, totalPrices: xxx, transactionNums: n},

  {....}

]

**/

  

function sumByQuarter(saleItems) {

    let list = [

        {quarter: 1, totalPrices: 0, transactionNums: 0},

        {quarter: 2, totalPrices: 0, transactionNums: 0},

        {quarter: 3, totalPrices: 0, transactionNums: 0},

        {quarter: 4, totalPrices: 0, transactionNums: 0}

    ];

    if (Array.isArray(saleItems)) {

        saleItems.forEach(function(item) {

            let totalItem = {},

                 num = item.salePrice,

                 totalNum =  0,

                 baseNum1 =  0,

                 baseNum2 =  0,

                 baseNum =  0;

  

            if(item.month <  4) {

                totalItem = list[0];

            } else  if (item.month <  7) {

                totalItem = list[1];

            } else  if (item.month <  10) {

                totalItem = list[2];

            } else {

                totalItem = list[3];

            }

  

            totalItem.transactionNums++;

            totalNum = totalItem.totalPrices;

            // precision handling

            try {

                 baseNum1 = num.toString().split(".")[1].length;

            } catch (e) {

                 baseNum1 =  0;

            }

            try {

                baseNum2 = totalNum.toString().split(".")[1].length;

           } catch (e) {

                baseNum2 =  0;

            }

            baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));

  

            totalItem.totalPrices = (num * baseNum + totalNum * baseNum) / baseNum;

        });

    } else {

        console.log(`

            error: The first parameter should be an Array, e.g.,

            [

              {

                   month: n, //[1-12],

                   date: n, //[1-31],

                   transationId: "xxx",

                   salePrice: number

              }

          ]

       `);

    }

    return list;

}

  

/**

Question 4: write a function to calculate and return a list of average sales for each quarter, expected result like:

[

{quarter: 1, averagePrices: xxx, transactionNums: n},

{....}

]

**/

  

function averageByQuarter(saleItems) {

    // reused the 'sumByQuarter'

    let list = sumByQuarter(saleItems);

  

    list.forEach(function(item) {

        let num = item.totalPrices,

             totalNum = item.transactionNums,

             baseNum =  0;

        if(totalNum ===  0) {

            item.averagePrices =  0;

        } else {

            // precision handling

            try {

                baseNum = num.toString().split(".")[1].length;

            } catch (e) {

                baseNum =  0;

            }

            item.averagePrices = (Number(num.toString().replace(".", "")) / totalNum) / Math.pow(10, baseNum);

       }

        delete item.totalPrices;

    });

    return list;

}

  
  

/**

Question 5: please create a tool to generate Sequence

Expected to be used like:

var sequence1 = new Sequence();

sequence1.next() --> return 1;

sequence1.next() --> return 2;

in another module:

var sequence2 = new Sequence();

sequence2.next() --> 3;

sequence2.next() --> 4;

**/

  

// ES5

var Sequence;

(function(){

    var unique;

    Sequence =  function(){

        if(unique){

            return unique

        }

        unique =  this;

        this.index =  1;

        this.next =  function() {

           return  this.index++;

       };

    }

}());

  

// ES6

class Sequence {

    next() {

        return Sequence.index++;

    }

}

Sequence.index =  1;

  
  

/**

Question 6:

AllKeys: 0-9;

usedKeys: an array to store all used keys like [2,3,4];

We want to get an array which contains all the unused keys,in this example it would be: [0,1,5,6,7,8,9]

**/

  

function getUnUsedKeys(allKeys, usedKeys) {

    //TODO

    if (Array.isArray(allKeys) && Array.isArray(usedKeys)) {

        let newArr = allKeys.concat(usedKeys),

             unusedKeys = [];

  

        // sort the values, and then remove duplicate values in loop

       newArr.sort();

       for(let i =  0; i < newArr.length; i++){

           if(newArr[i] !== newArr[i+1]) {

                unusedKeys.push(newArr[i]);

           } else {

               i++;

           }

        }

        return unusedKeys;

    } else {

        console.log('error: The first parameter and the second parameter should be an Array');

    }

}
  • 代码
    459 引用 • 591 回帖 • 8 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 2 关注

相关帖子

13 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • visus

    👍 此处不留爷,自有留爷处,相信自己,除非别人给出信服理由,否者就这样干下去

  • 其他回帖
  • visus

    可以,这操作,拼多多,估计就是这 bug

  • huangkangyi1

    是铃盛的题吗,可能太繁琐了你的代码

    1 回复
  • visus

    这个世界很多都人,性格不一样的,别把自己努力这么轻易给别人的不答复而否定了,我反正没看出问题,是不是没防空或者大数据批量处理没考虑,我是菜鸡的 JS

    1 回复
  • 查看全部回帖

推荐标签 标签

  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    139 引用 • 441 回帖 • 1 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 692 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 421 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6507 引用 • 29243 回帖 • 246 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 4 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 1 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    311 引用 • 1666 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 401 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 223 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 5 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 551 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 160 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 431 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 4 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 422 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    172 引用 • 990 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 7 关注