面试手写第六期

2024-02-04 12:12
文章标签 面试 第六期 手写

本文主要是介绍面试手写第六期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一. Promise封装Ajax请求
  • 二. setTimeout实现setInterval
  • 三. js对象转换为树结构
  • 四. 实现JSON.stringfy方法
  • 五. new操作符的实现
  • 六. 数组去重的几种方法
  • 七. 大数相加
  • 八. 大数相乘

一. Promise封装Ajax请求

function getJSON(url) {return new Promise((resolve, reject) => {let xhr = new XMLHttpRequest();// 新建一个HTTP请求xhr.open('get', url, true);// 设置状态的监听函数xhr.onreadystatechange = function () {if (this.readyState !== 4) return;if (this.status === 200) {resolve(this.response);} else {reject(new Error(this.statusText));}};xhr.onerror = function () {reject(new Error(this.statusText));};xhr.responseType = 'json';xhr.setRequestHeader('Accept', 'application/json');xhr.send(null);});
}

二. setTimeout实现setInterval

function mySetTimeout(func, delay) {let timer = null;const interval = () => {func();timer = setTimeout(interval, delay);};setTimeout(interval, delay);return {cancel: () => {clearTimeout(timer);},};
}const { cancel } = mySetTimeout(() => console.log('999'), 1000);setTimeout(() => {cancel();
}, 4000);

三. js对象转换为树结构

function arrayToTreeRec(nodes) {const map = {};const tree = [];for (const node of nodes) {node[node.id] = { ...node, children: [] };}for (const node of Object.values(map)) {if (node.parentId === null) {tree.push(node);} else {map[node.parentId].children.push(node);}}return tree;
}

四. 实现JSON.stringfy方法

function jsonStringify(obj) {// 处理非对象类型,直接返回对应的字符串形式if (typeof obj !== 'object' || obj === null) {// 处理字符串类型if (typeof obj === 'string') {console.log(obj);return '"' + obj + '"';}return String(obj);}// 处理数组类型if (Array.isArray(obj)) {const result = [];for (let i = 0; i < obj.length; i++) {result.push(jsonStringify(obj[i]));}return '[' + result.join(',') + ']';}// 处理对象类型const result = [];for (let key in obj) {if (obj.hasOwnProperty(key)) {const value = jsonStringify(obj[key]);// 处理 undefined、函数和 symbol 属性值if (value !== undefined) {const prop = '"' + key + '":' + value;result.push(prop);}}}return '{' + result.join(',') + '}';
}let obj = {name: 'zs',age: 18,hobby: ['1', '2', '3']
}
console.log(jsonStringify(obj));

五. new操作符的实现

function _new(obj, ...rest){// 基于obj的原型创建一个新的对象const newObj = Object.create(obj.prototype);// 添加属性到新创建的newObj上, 并获取obj函数执行的结果.const result = obj.apply(newObj, rest);// 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象return typeof result === 'object' ? result : newObj;
}

六. 数组去重的几种方法

  1. 两层for循环
function unique(arr) {let len = arr.lengthfor(let i = 0; i < len; i++) {for(let j = i + 1; j < len; j++) {if(arr[i] == arr[j]) {arr.splice(j, 1)j--len--}}}return arr
}
  1. filter + indexOf
function unique(arr) {return arr.filter((item, index) => {return arr.indexOf(item) == index})
}
  1. 创建新数组 + includes
function unique(arr) {let newArr = []for(let i = 0; i < arr.length; i++) {if(!newArr.includes(arr[i])) {newArr.push(arr[i])}}return newArr
}
  1. indexOf实现
function unique(arr) {let newArr = []for(let i = 0; i < arr.length; i++) {if(newArr.indexOf(arr[i]) === -1) {newArr.push(arr[i])}}return newArr
}
  1. Set实现
function unique(arr) {return [...new Set(arr)]
}

七. 大数相加

function add(str1, str2) {let maxLength = Math.max(str1.length, str2.length)str1 = str1.padStart(maxLength, 0)str2 = str2.padStart(maxLength, 0)let temp = 0let flag = 0 // 余数let result = ''for(let i = maxLength - 1; i >= 0; i--) {temp = str1[i] + str2[i] + flagflag = Math.floor(temp / 10)result = temp % 10 + result}if(flag == 1) {result = '1' + result}return result
}let a = "9876543210123456789000000000123";
let b = "1234567898765432100000012345678901";
console.log(add(a, b));

八. 大数相乘

function multiplyStrings(num1, num2) {const len1 = num1.length;const len2 = num2.length;const result = new Array(len1 + len2).fill(0); // 结果数组初始化为0for (let i = len1 - 1; i >= 0; i--) {for (let j = len2 - 1; j >= 0; j--) {const product = Number(num1[i]) * Number(num2[j]); // 计算当前位的乘积const sum = result[i + j + 1] + product; // 当前位的和等于之前的结果加上当前位乘积result[i + j + 1] = sum % 10; // 保存当前位的数值result[i + j] += Math.floor(sum / 10); // 进位}}// 去掉结果前面的0while (result[0] === 0 && result.length > 1) {result.shift();}return result.join(''); // 将结果转为字符串返回
}let a = "123";
let b = "456";
console.log(multiplyStrings(a, b));

这篇关于面试手写第六期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677462

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

贝壳面试:什么是回表?什么是索引下推?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL 索引下推 的认识? 2.在MySQL中,索引下推 是如何实现的?请简述其工作原理。 3、说说什么是 回表,什么是 索引下推 ? 最近有小伙伴在面试 贝壳、soul,又遇到了相关的

毕业前第二次面试的感慨

距面试已经过去了有几天了,我现在想起来都有说多的恨感慨。 我一直都是想找刚刚起步的企业,因为这能让我学到更多的东西,然而正好有一家企业是刚起步的,而且他还有自己的产品专利,可以说这是一家,即是创业又是刚起步的公司,这家公司回复了我投给他的简历,这家企业想进一步了解我的情况,因为简历上我符合这家企业的基本要求,所以要进一步了解。 虽然面试的过程中,他给我的面试题,我做得并不是很理想,

腾讯社招面试经历

前提:本人2011年毕业于一个普通本科,工作不到2年。   15号晚上7点多,正在炒菜做饭,腾讯忽然打电话来问我对他们的Linux C++的职位是否感兴趣,我表达了我感兴趣之后,就开始了一段简短的电话面试,电话面试主要内容:C++和TCP socket通信的一些基础知识。之后就问我一道算法题:10亿个整数,随机生成,可重复,求最大的前1万个。当时我一下子就蒙了,没反应过来,何况我还正在烧

完整的腾讯面试经过

从9月10号开始到现在快两个月了,两个多月中,我经历数次面试和笔试,在经历这些的同时积累了不少的经验,也学到了不少东西,在此把它记录下来,算是和一起找工作中的同学一起共勉吧。我是本校的学生,专业是机械制造及其自动化,找工作的主要目标是计算机软件类和机械制造方向的国内的企业,所以意向去外企的同学就不必浪费时间看这些面经啦,想去国内IT企业的同学可以继续看下去。本贴中我把最近的腾讯面试经过写下

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

仕考网:结构化面试流程介绍

(一)结构化面试 结构化面试,也叫做标准化面试,考官按照预先设定好的一套试题以问答方式与应试者当面交谈,根据应试者的言语、行为表现,对其相关能力和个性特征作出相应评价。 (二)考试流程 抵达考场——审核抽签——面试候考——进入考场——面试答题——考生退场——计分审核 (三)答题技巧 1.声音洪亮,音量可以比平时说话声音大一点。 2.语速不要过快,语速快容易卡顿,而且不便于考官听清答

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本