记一次面试题

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

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

/**

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');

    }

}
  • 代码
    468 引用 • 631 回帖 • 9 关注
  • 面试

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

    325 引用 • 1395 回帖

相关帖子

13 回帖

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • huazhi
    作者

    简历评审没过,面试都没给。。。
    难道我写的都错了吗?

  • visus

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

  • visus

    这个世界上,最帅的人就是自信的人

  • visus

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

    1 回复
  • huazhi
    作者

    感谢你~

    1 回复
  • visus

    客气了,帅哥哥

    1 回复
  • huazhi
    作者

    你说的“没放空和大数据批量处理”,具体说的是那块操作呢?讨论一下~

    1 回复
  • visus

    java 里面是从参数获取的对象吧,extensions,我猜的,没实践过 JS

    1 回复
  • huazhi
    作者

    不太能 get 你的点,不过对于 extensions 我只是用了 Array.isArray 来做非空数组的判断

  • huangkangyi1

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

    1 回复
  • huazhi
    作者

    sumByQuarter,这个我也觉得精度处理的不好,不是的数据精度是怎么样的,在业务实践中,都是和后端沟通一下,直接放大/缩小 1000 就好了

    2 回复
  • visus

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

  • huangkangyi1

    不是这些小问题,建议了解下 es6,很多地方几行代码就能搞定

    function getUnUsedKeys(allKeys, usedKeys) {
    
    
    	//TODO
    	let all = new Set(Array.from(new Array(allKeys)).map((v, k) => k))
    	let used = new Set(usedKeys)
    	let difference = new Set([...all].filter(x => !used.has(x)));
    	return Array.from(difference)
    }
    
请输入回帖内容 ...

推荐标签 标签

  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 3 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 102 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3189 引用 • 8214 回帖 • 3 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 3 关注
  • MyBatis

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

    170 引用 • 414 回帖 • 383 关注
  • JetBrains

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

    18 引用 • 54 回帖 • 1 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    51 引用 • 25 回帖 • 2 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 556 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 100 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 281 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 161 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    177 引用 • 816 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 160 关注
  • 自由行
    7 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 742 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 88 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 71 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 438 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 283 关注
  • iOS

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

    85 引用 • 139 回帖