每天嚼烂5道精选面试题,中高级工程师的进阶之路(day01)(代码片段)

贪吃ღ大魔王 贪吃ღ大魔王     2022-12-05     350

关键词:


程序员才懂的哪些事儿:




1、封装一个方法,要求把给定的任意的 IP 字符串,转化成 32 位的二进制字符串。

思路:

  1. 用 split()将 ip 炸开,进行遍历
  2. 将每个截断转为数字,再转为二进制字符串
  3. 如果截断的长度不够八位,需要补够八位
  4. 存入数组,转为字符串

实现步骤:

  1. 用 split()将 ip 炸开,用 list 接收
        function toget(ip) 
            let list;
            list = ip.split('.')
            console.log(list);
  		
        toget('172.1.1.1');

得到的 list 是一个数组:

  1. 遍历 list,将每个字符串转为数字,再转为二进制,使用 toString(2)
for (let i = 0; i < list.length; i++) 
                str = (list[i] - 0).toString(2)  
                console.log(str);
            

得到四段二进制的字符串:

这里发现如果进行拼接的话,组成的字符串不是32位,并不符合题目要求。所以需要进行判断

  1. 如果转化后的二进制字符串不是八位,则需要补够八位,这里可以使用 padStart()
for (let i = 0; i < list.length; i++) 
                str = (list[i] - 0).toString(2)
                if (str.length < 8) 
                    str = str.padStart(8, '0')
                
                console.log(str);
            

也可以使用 str = '0' + str

同样可以得到所需要的八位字符串:

  1. 将每段字符串存入到数组中,再转为字符串
arr.push(str)
console.log(arr.join(''));

实现效果:

完整实现代码:

function toget(ip) 
            let list = [];
            let str = ''
            list.push(ip.split('.')[0], ip.split('.')[1], ip.split('.')[2], ip.split('.')[3])
            for (let i = 0; i < list.length; i++) 
                str += list[i].charCodeAt().toString(2)
            
            console.log(str);
        
        toget('172.0.0.1');



2、求出现次数最多的字符、出现了多少次。

思路:

  1. 由于需要判断出现的次数,这里选择使用对象存入字符
  2. 遍历字符串,判断 obj 对象中是否存在该字符串
  3. 如果不存在,则设置位对象的属性 key,且属性值设为 1
  4. 如果存在,则这个属性的属性值加 1
  5. 假设最大字符和最大次数 max ; 遍历对象,如果最大次数 max 小于某属性的属性值,那么 max 等于这个属性值,最大字符等于这个属性

实现步骤:

  1. 遍历字符串,判断 obj 对象中是否存在该字符串
  2. 如果不存在,则设置位对象的属性 key,且属性值设为 1
  3. 如果存在,则这个属性的属性值加 1
 function getMax(str) 
            let obj = 
            for (var i = 0; i < str.length; i++) 
                var char = str.charAt(i)
                if (obj[char]) obj[char]++
                else obj[char] = 1
            
            console.log(obj);
        
        getMax('wszxdswsasfdwsvgope')

打印这个对象,查看 obj

  1. 假设最大字符和最大次数 max ; 遍历对象,如果最大次数 max 小于某属性的属性值,那么 max 等于这个属性值,最大字符等于这个属性
			let t = ''
            let max = 0;
            for (var key in obj) 
                if (obj[key] > max) 
                    max = obj[key]
                    t = key
                
            
            console.log('出现最多的字符是:' + t, '\\n次数是:' + max);

实现效果:

完整实现代码:

 function getMax(str) 
            let obj = 
            for (var i = 0; i < str.length; i++) 
                var char = str.charAt(i)
                if (obj[char]) obj[char]++
                else obj[char] = 1
            
            let t = ''
            let max = 0;
            for (var key in obj) 
                if (obj[key] > max) 
                    max = obj[key]
                    t = key
                
            
           console.log('出现最多的字符是:' + t, '\\n次数是:' + max);
        
        getMax('wszxdswsasfdwsvgope')



3、封装冒泡排序算法 sortMe() 。

一句话概括冒泡排序:

  • 依次对数组中相邻数字进行比较(两两比较),大的放后面

理解:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.
  • 在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

思路:

  1. 两层循环,第一次循环是比较的趟数 i 从0开始 寻找规律 i < arr.length - 1
  2. 第二层循环,负责比较次数 j 从0开始 寻找规律 i < arr.length - i - 1
  3. 前一个数比 比较的数大,进行交换

<例图供参考>

实现步骤:

  1. 两层循环,第一次循环是比较的趟数 i 从0开始 寻找规律 i < arr.length - 1
  2. 第二层循环,负责比较次数 j 从0开始 寻找规律 i < arr.length - i - 1
 for (var i = 0; i < arr.length - 1; i++) 
                for (var j = 0; j < arr.length - i - 1; j++) 
                    if (arr[j] > arr[j + 1]) 
                    
                
            
  1. 前一个数比 比较的数大,进行交换
				num = arr[j]
                arr[j] = arr[j + 1]
               	arr[j + 1] = num

实现效果:

完整实现代码:

function sortMe(arr) 
            let num = 0
            for (var i = 0; i < arr.length - 1; i++) 
                for (var j = 0; j < arr.length - i - 1; j++) 
                    if (arr[j] > arr[j + 1]) 
                        num = arr[j]
                        arr[j] = arr[j + 1]
                        arr[j + 1] = num
                    
                
            
            console.log(arr);

        
        sortMe([5, 9, 1, 7, 4, 2, 5])



4、使用 Promise 封装 $.ajax,得到 request() 。

思路:

  1. 理解回调函数,同步异步,Promise对象
  2. 使用 jQuery 封装 ajax 请求,包括请求方法method、请求地址path、请求成功回调successCallback请求失败回调failCallback、请求头headers、响应体body
  3. 正常的ajax请求步骤,需要先遍历请求头,再设置请求头
  4. 请求成功执行成功回调,请求失败执行失败回调
  5. 使用promise 封装改造

理解:

  • 什么是回调函数 Callback ?

callback 是一种特殊的函数,这个函数被作为参 数传给另一个函数去调用。

常见实例:

$button.on('click', function())
click后面的 function 就是一个回调,用户点击 button 时调用的(当用户点击之后,这个函数才执行,现在我只是传了一个参数,这个参数是一个点击后要执行的函数)。
div.addEventListener('click', function())
click 后面的 function 也是一个回调,是浏览器在用户点击 button 时调用的。
一般来说,只要参数是一个函数,那么这个函数就是回调。

一般,在 执行异步任务的时候,就会使用 callback。

  • 什么是异步?

JS 引擎不能同时做两件事。

同步:一定要等任务执行完了,得到结果,才执行下一个任务

异步:不等任务执行完,直接执行下一个任务。

常见异步:定时器,延时器,ajax请求…

  • 什么是Promise?

简单来理解:Promise 是一个对象,通过返回这个promise对象,再调用他的then()和 catch()可以来解决异步

  • $.ajax()函数会返回一个promise,然后在后面.then(success,fail)时候,如果成功了就会调用第一个参数里的函数即success函数,如果失败了就会调用第二个参数的函数即fail函数.

第一次封装:

window.jQuery.ajax = (method,path,body,successFn,failFn,headers)=>
    
    let request = new XMLHttpRequest();
    request.open(method,path);//配置

    for (const key in headers) //遍历header,设置响应头
        let value = headers[key];
        request.setRequestHeader(key,value);
    
    request.send(body);//发送,并配置响应体

    request.onreadystatechange = ()=>
        if(request.readyState ===4)
            if ( request.status>=200&&request.status<=400)
                successFn.call(undefined,request.responseText);//执行成功函数
            else if(request.status>=400)
                failFn.call(undefined,request);//执行失败函数
            
        
    

再次封装:使用promise 简单改造

完整实现代码:

window.jQuery.ajax = ( method, path, body, headers ) => 
            // 返回一个promise对象 resolve, reject 获取异步数据
            return new Promise((resolve, reject) => 
                let request = new XMLHttpRequest()
                request.open(method, path) //配置

                 //遍历headers 设置响应头
                for (const key in headers) 
                    let value = headers[key]
                    request.setRequestHeader(key, value)
                

                //配置响应体  发送请求
                request.send(body)
                request.onreadystatechange = function () 
                    if (request.readyState === 4) 
                        if (request.status === 200) 
                            //执行成功函数
                            resolve.call(undefined, request.responseText)
                         else 
                            reject.call(undefined, request)
                        
                    
                
            )
        

使用方法:

这里我们使用 cnode开源的api 请求数据:https://cnodejs.org/api

 let myButton = document.getElementById('myButton');

        myButton.addEventListener("click", (e) => 
            //使用ajax
            $.ajax(
                method: "get",
                path: "https://cnodejs.org/api/v1/topics",
                body: "username=mtt&password=1",
                headers: 
                    "content-type": 'application/x-www-form-urlencoded',
                    'ws': 18,

                
            ).then(
                (responseText) =>  console.log(responseText); ,//成功就调用这个函数
                (request) =>  console.log(request); //失败就调用这个函数
            )
        )

实现效果:






5、有哪些数组去重的方法?(至少3种)

方法:

  1. splice() 去重
  2. indexOf() 去重
  3. Set() 去重
  4. sort() 去重
  5. 递归去重
  6. 对象的属性的特点 去重

1.splice() 去重 ES5常用

思路:

  1. 遍历数组,第一次循环负责趟数
  2. 第二次循环判断是否相等进行去重,如果循环的数组元素与下一个相等则去重

完整实现代码:

 function delArr(arr) 
            for (var i = 0; i < arr.length; i++) 
                for (var j = i + 1; j < arr.length; j++) 
                    if (arr[i] == arr[j])          //第一个等同于第二个,splice方法删除第二个
                        arr.splice(j, 1);
                    
                
            
            console.log(arr);
        
        delArr([2, 5, 9, 4, 2, 5, 3, 9, 2, 4])

实现效果:

2.indexOf() 去重

思路:

  1. 创建新数组 list用来存放,遍历数组 arr
  2. 使用 indexOf()来判断 新数组list中是否存在arr[i]
  3. 如果不存在,indexOf()==-1 则将 arr[i]存入新数组 list

完整实现代码:

function delArr(arr) 
            var list = [];
            for (var i = 0; i < arr.length; i++) 
                if (list.indexOf(arr[i]) === -1) 
                    list.push(arr[i])
                
            
            console.log(list);

        
        delArr([1, 3, 5, 7, 5, 3, 7, 1, 5])

实现效果:


3.Set() 去重 ES6常用

思路:

  1. 遍历数组,直接使用new set()方法

完整实现代码:

function delArr(arr) 
            let list = new Set(arr)
            console.log(list);

        
        delArr([1, 3, 5, 7, 5, 3, 7, 1, 5])

实现效果:

这里也可以直接使用 es6 的 … 语法

console.log([...new Set(arr)]);

4.sort() 去重

思路:

  1. 使用sort()方法先将 arr 数组进行排序
  2. 创建新数组list,遍历数组arr 如果当前元素arr[i] 不等于上一个元素arr[i-1] 则将当前元素arr[i]放入新数组中
  3. 如果当前元素为 arr[1]时,则它的上一个元素时 arr[0],我们需要在创新新数组list时,把 arr[0] 存入

完整实现代码:

function delArr(arr) 
            arr = arr.sort()
            var list = [arr[0]];
            for (var i = 1; i < arr.length; i++) 
                if (arr[i] !== arr[i - 1]) 
                 console.log(arr[i - 1]);
                    list.push(arr[i]);
                
            
            console.log(list);

        
        delArr([1, 3, 5, 7, 5, 3, 7, 1, 5])

实现效果:


5.递归去重

思路:

  1. 先使用sort()先将数组arr进行排序,为了去重更加方便
  2. 使用递归,设置递归终止条件,index>=1
  3. 如果当前元素等于上一个元素,则用`splice(index,1)进行截取

完整实现代码:

function delArr(arr) 
            arr.sort(function 查看详情  

python面试大全pdf(245道python面试题)

...础及进阶的方方面面,无论你是面试初级工程师还是中高级工程师这 查看详情

android实习面试每天10道面试题合集5篇

...#xff0c;欢迎大家补充以及指教,谢谢!第一天Android每天10道面试题01第二天Android每天10道面试题02第三天Android每天10道面试题03第四天Android每天10道面试题04第五天Android每天10道面试题05 查看详情

2021精选1万道大厂java中高级面试题,面试官能问到的都有

又是一年过去了,职场的积雪还没有消融,又迎来了一次大考。疫情还没完全过去,大家强打起精神,相互问好致意,眼角却满是疲惫...企业调薪、裁员、组织架构调整等等,坏消息只多不少,最近也... 查看详情

java面试高频题精选300道,一份通往阿里的必备指南(pdf文档)

...面试题及面试高频的考点题及技术点梳理成一份“Java工程师高频面试体系.pdf和一份网上搜集的“Java核心知识点体系文档.pdf”(实际上比预期多花了不少精力),包含集合,JVM,并发编程、Sprin 查看详情

前端—每天5道面试题(代码片段)

前端—每天5道面试题(十)每天进步1%不多就1%一、用div+css布局的好处?表现和内容相分离将设计部分剥离出来放在一个独立样式文件中,HTML文件中只存放文本信息。提高搜索引擎对网页的索引效率用只包含... 查看详情

前端—每天5道面试题(十四)(代码片段)

前端—每天5道面试题(十四)每天进步1%不多就1%一、JavaScript是一门什么样的语言,它有哪些特点?javaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器... 查看详情

前端—每天5道面试题(代码片段)

前端—每天5道面试题(十一)每天进步1%不多就1%一、简述对Web语义化的理解?就是让浏览器更好的读懂你写的代码,在进行HTML结构、表现、行为设计时,尽量使用语义化的标签,使程序代码简介明了࿰... 查看详情

前端—每天5道面试题(代码片段)

前端—每天5道面试题(九)每天进步1%不多就1%一、overflow有哪些属性值?Visible:默认值,内容不会被修剪,会呈现在元素框之外。Hidden:内容会被修剪,并且其余内容是不可见的。Scroll:内容... 查看详情

前端—每天5道面试题(十三)(代码片段)

前端—每天5道面试题(十三)一、display:none;和visibilty:hidden;和opacity:0;和overflow:hidden的区别?display:none;隐藏自己,隐藏后不占据位置visibilty:hidden;隐藏 查看详情

前端—每天5道面试题(代码片段)

前端—每天5道面试题(十二)每天进步1%不多就1%一、CSS3新特性有哪些1.颜色:新增RGBA,HSLA模式2.文字阴影(text-shadow、)3.边框:圆角(border-radius)边框阴影:box-shadow4.盒子模型:box- 查看详情

java面试java基础,2021年阿里java面试题精选

01Java技术概览02Java开发工具及环境设置03Java语言中的数据类型与运算符04程序设计中的流程控制05数组06字符串的处理07类和对象08重载和包09继承和多态第10章接口与内部类Kafka进阶篇知识点Kafka高级篇知识点44个Kafka知识点(基... 查看详情

撩课-python-每天5道面试题-第5天(代码片段)

一.给定一个圆心和半径,以及一个点坐标,判定该点是否在圆内;例如:用户输入圆心:(1,2)半径:2.5测试点为(2,2)结果:判定测试点是在圆内思路:结合勾股定理,计算测试点距离圆心的距离test_distance;比对test_distance与半径的长短,如果大于... 查看详情

撩课-python-每天5道面试题-第3天(代码片段)

一.代码实现:计算1到100之间,所有的奇数之和result=0foriinrange(1,101):result+=iprint(result) 二.代码实现:接收用户输入数字,求出从0至这个数字的累加和;例如:用户输入9,则计算出0+1+2+3+4+...+9的和,并打印出表达式执行结果num_str=input("请... 查看详情

撩课-java每天5道面试题第10天(代码片段)

撩课Java+系统架构 视频点击开始学习81.Servlet的会话机制?HTTP是一种无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。它与FTP、Telnet等协议不同... 查看详情

撩课-python-每天5道面试题-第2天(代码片段)

一.简述编程过程中,注释的作用?(1)方便开发人员自己理清楚代码思路因为开发人员在拿到一个需求时,首先应该思考的是如何将需求问题,分解成具体的实施步骤;第一步干啥,第二步干啥,第三步干啥,安排的明明白白;这一步也是零... 查看详情

撩课-java每天5道面试题第9天(代码片段)

撩课Java+系统架构 视频点击开始学习76、XML技术的作用?XML技术用于数据存储、信息配置、数据交换三方面。可以将数据存储在XML中,通过节点、元素内容、属性标示数据内容及关系。可以使用XML很方便的做信息配置,软件... 查看详情

撩课-java每天5道面试题第11天(代码片段)

86.如何获得高效的数据库逻辑结构?从关系数据库的表中删除冗余信息的过程称为数据规范化,是得到高效的关系型数据库表的逻辑结构最好和最容易的方法。规范化数据时应执行以下操作:1.将数据库的结构精简为最简单的形... 查看详情