热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

牛客网前端大挑战题解

牛客网-前端大挑战-题解牛客网-前端大挑战-(1-15)题解1.修改this指向2.获取url参数3.dom节点查找4.根据包名,在指定空间中创建对象5.数组去重6.斐波那契数列7

牛客网-前端大挑战-题解

  • 牛客网-前端大挑战-(1-15)题解
      • 1.修改 this 指向
      • 2.获取 url 参数
      • 3.dom 节点查找
      • 4.根据包名,在指定空间中创建对象
      • 5. 数组去重
      • 6.斐波那契数列
      • 7.时间格式化输出
      • 8.获取字符串的长度
      • 9.邮箱字符串判断
      • 10.颜色字符串转换
      • 11.将字符串转换为驼峰格式
      • 12.字符串字符统计
      • 13.加粗文字
      • 14.段落标识
      • 15.设置文字颜色
牛客网-前端大挑战-(1-15)题解

本文章尽量用简洁的代码去完成题目要求,话不多说,上代码

1.修改 this 指向

题目描述 :封装函数 f,使 f 的 this 指向指定的对象

function bindThis(f, oTarget) {
//方法1 apply() 注:直接f.apply(oTarget,arguments)不对,
//因为题中说的是封装函数f,使用apply方法,会立即执行这个函数,
return function(){
return f.apply(oTarget,arguments);
}; //方法2 bind() bind可以直接返回这个更换this的函数
//只是改变了执行的上下文,并未立即执行而是回调执行。
return f.bind(oTarget); //方法3 call() apply、call是传参数形式的区别,
//前者是参数数组,后者是参数项
return function(x,y){
return f.call(oTarget,x,y);
};
}

2.获取 url 参数

题目描述:获取 url 中的参数

  1. 指定参数名称,返回该参数的值 或者 空字符串
  2. 不指定参数名称,返回全部的参数对象 或者 {}
  3. 如果存在多个同名参数,则返回数组

function getUrlParam(sUrl, sKey) {
let str = sUrl.split('?')[1].split('#')[0].split('&'); // 取出每个参数的键值对放入数组
let obj = { };
str.forEach(element => {
let [key, value] = element.split('='); // 取出数组中每一项的键与值
if(obj[key] === undefined ){ // 表示第一次遍历这个元素,直接添加到对象上面
obj[key]=value
}else{
obj[key]=[].concat(obj[key],value); // 表示不是第一次遍历说明这个键已有,通过数组存起来。
}});
return sKey=== undefined ? obj:obj[sKey]||'' // 如果该方法为一个参数,则返回对象。
//如果为两个参数,sKey存在,则返回值或数组,否则返回空字符。
}

3.dom 节点查找

题目描述:查找两个节点的最近的一个共同父节点,可以包括节点自身.
输入描述:oNode1 和 oNode2 在同一文档中,且不会为相同的节点

function commonParentNode(oNode1, oNode2) {
while(oNode1){
if(oNode1.contains(oNode2)){
return oNode1; //oNode1包含oNode2,返回oNode1
}else{
oNode1=oNode1.parentNode //oNode1不包含oNode2,从oNode1父节点里找
}
}
}

4.根据包名,在指定空间中创建对象

题目描述:根据包名,在指定空间中创建对象。
输入描述:namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)。
输出描述:{a: {test: 1, b: {c: {d: {}}}}}

function namespace(oNamespace, sPackage) {
return sPackage.split('.').forEach((k) => {
if(!oNamespace[k]) {
oNamespace[k] = { }; //不含该字符,就赋值为{}
}
oNamespace = oNamespace[k]; //找下一层
});
}

5. 数组去重

题目描述:为 Array 对象添加一个去除重复项的方法。
输入描述:[false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a’, ‘a’, NaN]。
输出描述:[false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a’]

Array.prototype.uniq = function () {
return [...new Set(this)];
}

6.斐波那契数列

题目描述:用 Javascript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等。

function fibonacci(n) {
if(n<3){
return 1;
}else{
let f1 = 1,f2 = 1,f3;
for(let i=3;i<=n;i++){
f3 = f1 +f2
f1 = f2
f2 = f3
}
return f3
}
}

7.时间格式化输出

题目描述
按所给的时间格式输出指定的时间
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’] 中的某一个,本 demo 结果为 五

function formatDate(t,str){
let obj = {
yyyy:t.getFullYear(),
yy:(""+ t.getFullYear()).slice(-2),
M:t.getMonth()+1,
MM:("0"+ (t.getMonth()+1)).slice(-2),
d:t.getDate(),
dd:("0" + t.getDate()).slice(-2),
H:t.getHours(),
HH:("0" + t.getHours()).slice(-2),
h:t.getHours() % 12,
hh:("0"+t.getHours() % 12).slice(-2),
m:t.getMinutes(),
mm:("0" + t.getMinutes()).slice(-2),
s:t.getSeconds(),
ss:("0" + t.getSeconds()).slice(-2),
w:['日', '一', '二', '三', '四', '五', '六'][t.getDay()]
};
return str.replace(/([a-z]+)/ig,function(x){ return obj[x]});
}

8.获取字符串的长度

题目描述:如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2

function strLength(s, bUnicode255For1) {
let sum = 0
for(let i=0;i<s.length;i++){
sum += s.charCodeAt(i)>255 ? 2 : 1; //字符编码大于255,加2,否则加1
}
return bUnicode255For1 ? s.length: sum; //bUnicode255For1为ture返回s.length,false返回sum
}

9.邮箱字符串判断

题目描述:判断输入是否是正确的邮箱格式
输入描述:邮箱字符串
输出描述:true表示格式正确

function isAvailableEmail(sEmail) {
let reg = /^[\w\.]+@(\w+)([.]\w+)+$/;
//let reg = /^[\w.]+@\w+.(org|com)/
//let reg= /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return reg.test(sEmail); //在网上查了大致这几种
}

10.颜色字符串转换

题目描述:将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff

  1. rgb 中每个 , 后面的空格数量不固定
  2. 十六进制表达式使用六位小写字母
  3. 如果输入不符合 rgb 格式,返回原始输入
    输入描述:‘rgb(255, 255, 255)’
    输出描述:#ffffff

function rgb2hex(sRGB) {
let res = '#';
let count = 0;
sRGB.replace(/(\d)+/g,function(x) {
count++;
res += ('0'+Number(x).toString(16)).slice(-2);
//加'0'和slice(-2)是保证取两位,
})
if(count != 3) res = sRGB; //不符合 rgb 格式,返回原始输入
return res;
}

11.将字符串转换为驼峰格式

题目描述:css 中经常有类似 background-image 这种通过 &#8211; 连接的字符,通过 Javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能

  1. 以 &#8211; 为分隔符,将第二个起的非空单词首字母转为大写
  2. -webkit-border-image 转换后的结果为 webkitBorderImage
    输入描述:‘font-size’
    输出描述:fontSize

function cssStyle2DomStyle(sName) {
let s = sName.split('-')
if(s[0]=='') s.shift(); //去掉空字符串
for(let i=1;i<s.length;i++){
s[i] = s[i].charAt(0).toUpperCase()+ s[i].slice(1);//第一个字符大写后拼接
}
return s.join('')
}

12.字符串字符统计

题目描述:统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率。

  1. 不限制 key 的顺序
  2. 输入的字符串参数不会为空
  3. 忽略空白字符
    输入描述:‘hello world’
    输出描述:{h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}

function count(str) {
let obj = { };
str = str.split('')
for(let i=0; i<str.length; i++){
if(obj.hasOwnProperty(str[i])){
obj[str[i]]++
}else{
obj[str[i]] = 1
}
}
return obj;
}

13.加粗文字

题目描述:使用一个标签将“牛客网”三个字加粗显示。

<p><strong>牛客网strong>,程序员必备求职神器p>

14.段落标识

题目描述:请将下面这句话以段落的形式展示在浏览器中——“牛客网是一个专注于程序员的学习和成长的专业平台。”

<p>牛客网是一个专注于程序员的学习和成长的专业平台。p>

15.设置文字颜色

题目描述:请使用嵌入样式将所有p标签设置为红色文字

<style> p{ color:red; } style>
<p>欢迎来到牛客网p>
<p>在这里,我们为你提供了IT名企的笔试面试题库p>
<p>在这里,我们以题会友p>
<p>QQ群号:272820159p>

义非侠不立,侠非义不成。
前端大挑战已完结!


推荐阅读
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
fadsfwebb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有