关键词:
程序员才懂的哪些事儿:
1、封装一个方法,要求把给定的任意的 IP 字符串,转化成 32 位的二进制字符串。
思路:
- 用 split()将 ip 炸开,进行遍历
- 将每个截断转为数字,再转为二进制字符串
- 如果截断的长度不够八位,需要补够八位
- 存入数组,转为字符串
实现步骤:
- 用 split()将 ip 炸开,用 list 接收
function toget(ip)
let list;
list = ip.split('.')
console.log(list);
toget('172.1.1.1');
得到的 list 是一个数组:
- 遍历 list,将每个字符串转为数字,再转为二进制,使用 toString(2)
for (let i = 0; i < list.length; i++)
str = (list[i] - 0).toString(2)
console.log(str);
得到四段二进制的字符串:
这里发现如果进行拼接的话,组成的字符串不是32位,并不符合题目要求。所以需要进行判断
- 如果转化后的二进制字符串不是八位,则需要补够八位,这里可以使用 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
同样可以得到所需要的八位字符串:
- 将每段字符串存入到数组中,再转为字符串
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、求出现次数最多的字符、出现了多少次。
思路:
- 由于需要判断出现的次数,这里选择使用对象存入字符
- 遍历字符串,判断
obj
对象中是否存在该字符串- 如果不存在,则设置位对象的属性
key
,且属性值设为 1- 如果存在,则这个属性的属性值加 1
- 假设最大字符和最大次数
max
; 遍历对象,如果最大次数max
小于某属性的属性值,那么max
等于这个属性值,最大字符等于这个属性
实现步骤:
- 遍历字符串,判断
obj
对象中是否存在该字符串 - 如果不存在,则设置位对象的属性
key
,且属性值设为 1 - 如果存在,则这个属性的属性值加 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
- 假设最大字符和最大次数
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() 。
一句话概括冒泡排序:
- 依次对数组中相邻数字进行比较(两两比较),大的放后面
理解:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.
- 在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
思路:
- 两层循环,第一次循环是比较的趟数 i 从0开始 寻找规律
i < arr.length - 1
- 第二层循环,负责比较次数 j 从0开始 寻找规律
i < arr.length - i - 1
- 前一个数比 比较的数大,进行交换
<例图供参考>
实现步骤:
- 两层循环,第一次循环是比较的趟数 i 从0开始 寻找规律
i < arr.length - 1
- 第二层循环,负责比较次数 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])
- 前一个数比 比较的数大,进行交换
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() 。
思路:
- 理解回调函数,同步异步,Promise对象
- 使用
jQuery
封装ajax
请求,包括请求方法method
、请求地址path
、请求成功回调successCallback
请求失败回调failCallback
、请求头headers
、响应体body
。- 正常的
ajax
请求步骤,需要先遍历请求头,再设置请求头- 请求成功执行成功回调,请求失败执行失败回调
- 使用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种)
方法:
- splice() 去重
- indexOf() 去重
- Set() 去重
- sort() 去重
- 递归去重
- 对象的属性的特点 去重
1.splice() 去重 ES5常用
思路:
- 遍历数组,第一次循环负责趟数
- 第二次循环判断是否相等进行去重,如果循环的数组元素与下一个相等则去重
完整实现代码:
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() 去重
思路:
- 创建新数组
list
用来存放,遍历数组 arr- 使用 indexOf()来判断 新数组
list
中是否存在arr[i]
- 如果不存在,
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常用
思路:
- 遍历数组,直接使用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() 去重
思路:
- 使用
sort()
方法先将 arr 数组进行排序- 创建新数组
list
,遍历数组arr
如果当前元素arr[i]
不等于上一个元素arr[i-1]
则将当前元素arr[i]
放入新数组中- 如果当前元素为
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.递归去重
思路:
- 先使用
sort()
先将数组arr
进行排序,为了去重更加方便- 使用递归,设置递归终止条件,
index>=1
- 如果当前元素等于上一个元素,则用`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.将数据库的结构精简为最简单的形... 查看详情