每日前端手写题--day14

以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?

第14天要刷的手写题如下:

  1. 写一个函数,实现多层嵌套的数字数组求和
  2. 写一个函数,实现对函数的乱序排列
  3. 写一个函数,实现sleep功能

下面是我的一些理解:

1. 写一个函数,实现多层嵌套的数字数组求和

解决这个问题的本质在于如何从嵌套着的数组中提取出元素,大概有两种思路:

  • 使用递归:递归函数的构建过程为:先假设数组中没有嵌套数组,使用遍历的方式求出数组的元素之和->然后增加处理嵌套数组元素的分支逻辑(递归调用本函数即可)
  • 利用特点:针对此数组元素只有可能是数字的特性,将其先转成字符串toString,然后去掉字符串中所有的[或者],最后使用split还原成数组,遍历然后相加即可
js 复制代码
// 递归的做法
function addNumbers (input) {
    if(!Array.isArray(input)) return input;
    let rst = 0;
    const _arr = [...input];

    while (_arr.length) {
        const _current = _arr.pop();
            rst += Array.isArray(_current)?addNumbers(_current):_current;
    }

    return rst;
}

// 转成字符串
function addNumbersUsingString (input) {
    if(!Array.isArray(input)) throw new Error('must be an array');
    let _toString = input.toString();
    _toString = _toString.replace(/[]/g,'');
    const _toArray = _toString.split(",");
    const rst = _toArray.reduce((accu, v, i ,a)=>{
        return accu+Number(v);
    },0)


    return rst;
}

const test = [1,[[22]],3,4,[[[[6]]]]];

console.log(addNumbers(test));
console.log(addNumbersUsingString(test));

2. 写一个函数,实现对函数的乱序排列

可以使用哈希的思想也可以取巧使用Array.prototype.sort方法。

  • 生成哈希下标:使用while循环每次从原数组中弹出一个元素,弹出元素的下标是随机生成的,直到原来数组元素弹完
  • 巧用sort方法:Array.prototype.sort的入参是一个函数,这个函数的返回值决定相邻两个元素的位置,所以只需要这个函数的返回值随机是true或者false即可!
js 复制代码
// 使用sort方法
const randomSort = inputArr => inputArr.sort(() => Math.random() - 0.5);

// 使用哈希下标
const randomSortHash = inputArr => {
    const _rst = [];
    const _arr = [...inputArr];
    while (_arr.length) {
        const _len = _arr.length;
        const _hash = _len*Math.random() | 0;
        console.log(_hash)
        const _current = _arr.splice(_hash,1)[0];
        _rst.push(_current);
    }
    return _rst;
};


const a = [1,2,3,4,5,6,7,8,9];

console.log(randomSort(a));
console.log(randomSortHash(a));

3. 写一个函数,实现sleep功能

两种实现思路:同步的和异步的

  • 同步:使用while和时间戳
  • 异步:使用定时器和promise
js 复制代码
// 异步
const asyncSleep = gap => new Promise(res => setTimeout(res, gap*1000));

// 同步
function syncSleep (gap) {
    const startTime = +new Date();
    while(+new Date() - startTime <= gap *1000){}
}

// 测试
async function test () {
    console.log(+new Date());
    await asyncSleep(2);
    console.log(+new Date());
    syncSleep(2);
    console.log(+new Date());
}

test();
相关推荐
郑州光合科技余经理29 分钟前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
梦想平凡1 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
yume_sibai2 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
计算机魔术师3 小时前
特朗普上台打给黄仁勋:AI末日论是骗局,我们绝不让它发生
前端
troy1284 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
计算机魔术师4 小时前
CEO说要慢下来,黑客说别做梦了——同一篇论文,两种命运
前端
kyriewen4 小时前
我花3天抓了一个幽灵bug,凶手藏在第4层
前端·javascript·程序员
IT_陈寒5 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
wangchunyu1145 小时前
JavaScript 零基础入门教程
前端
hanchenxing6 小时前
前端异步任务三方案:Celery vs Redis Stream vs BullMQ 实战对比消息队列
前端·数据库·redis·异步任务·方案对比