牛客网——前端大挑战

1.封装函数 f,使 f 的 this 指向指定的对象

1 function bindThis(f, oTarget) {
2     return f.bind(oTarget);
3 }

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

输入  http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe输出  [1, 2, 3]
 1 function getUrlParam(sUrl, sKey) {
 2     var obj = {};
 3     var index = sUrl.indexOf(‘?‘);
 4     //url没有带参数
 5     if(index==-1) {
 6         if(sKey==undefined){
 7             return obj;
 8         }else{
 9             return "";
10         }
11     }
12
13     var queryString = (sUrl.split("?")[1]).split("#")[0];
14     var query = queryString.split(‘&‘);//分离出了所有参数
15
16     for(var i=0;i<query.length;i++){
17         var keyValue = query[i].split("=");
18         var key = keyValue[0];
19         var value = keyValue[1];
20         //console.log(‘key: ‘+key+" value: "+value);
21         if(value ==""){
22             continue;//value值为空,进行下一次循环?为空就不进行统计了?
23         }
24         if(obj.hasOwnProperty(key)){//hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。
25             if(Array.isArray(obj[key])){//判断是不是数组
26                 obj[key].push(value);
27             }else{//不是数组
28                 var val = obj[key];
29                 obj[key] = [];
30                 obj[key].push(val);//?????有点蒙,这是为什么呀
31                 obj[key].push(value);//这一段else里面的是真的不懂
32             }
33
34         }else{//有新参数,直接添加
35             obj[key]=value;
36         }
37
38     }
39     //console.log(obj)
40     //1.指定参数名的,返回该参数的值或空
41     if(sKey){
42         return obj[sKey]?obj[sKey]:"";
43     }else{
44         return obj;
45
46     }
47
48 }

3.查找两个节点的最近的一个共同父节点,可以包括节点自身

  查找两个节点的最近的一个共同父节点,可以包括节点自身

1 function commonParentNode(oNode1, oNode2) {
2     for(;oNode1;oNode1=oNode1.parentNode){
3         if(oNode1.contains(oNode2)){
4             return oNode1;
5         }
6     }
7 }

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

输入描述    namespace({a: {test: 1, b: 2}}, ‘a.b.c.d‘)

输出描述    {a: {test: 1, b: {c: {d: {}}}}}

 1 function namespace(oNamespace, sPackage) {
 2     var arr = sPackage.split(‘.‘);
 3     var res = oNamespace;   // 保留对原始对象的引用
 4
 5     for(var i = 0, len = arr.length; i < len; i++) {
 6         if(arr[i] in oNamespace) {  // 空间名在对象中
 7             if(typeof oNamespace[arr[i]] !== "object") {    // 为原始值
 8                 oNamespace[arr[i]] = {};    // 将此属性设为空对象
 9             }
10         } else {    // 空间名不在对象中,建立此空间名属性,赋值为空
11             oNamespace[arr[i]] = {};
12         }
13
14         oNamespace = oNamespace[arr[i]];    // 将指针指向下一个空间名属性。
15     }
16
17     return res;
18
19 }

  方法二    递归

 1 function namespace(oNamespace, sPackage) {
 2    if(sPackage.length <= 0) return;
 3     // var arr = sPackage.split(‘.‘);
 4     var pointer = oNamespace;
 5
 6
 7         if(sPackage[0] in oNamespace) {
 8             if(typeof oNamespace[sPackage[0]] !== "object") {
 9                 oNamespace[sPackage[0]] = {};
10             }
11         } else {
12             oNamespace[sPackage[0]] = {};
13         }
14
15         oNamespace = oNamespace[sPackage[0]];
16
17         namespace(oNamespace, sPackage.slice(2));
18
19
20     return pointer;
21
22 }

5.为 Array 对象添加一个去除重复项的方法

输入    [false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a‘, ‘a‘, NaN]

输出    [false, true, undefined, null, NaN, 0, 1, {}, {}, ‘a‘]

 1 Array.prototype.uniq = function () {
 2    var resArr = [];
 3    var flag = true;
 4
 5    for(var i=0;i<this.length;i++){
 6        if(resArr.indexOf(this[i]) == -1){
 7            if(this[i] != this[i]){   //排除 NaN
 8               if(flag){
 9                    resArr.push(this[i]);
10                    flag = false;
11               }
12            }else{
13                 resArr.push(this[i]);
14            }
15        }
16    }
17     return resArr;
18 }

6.用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等

1 function fibonacci(n){
2     if(n==1||n==2)
3         return 1;
4     return fibonacci(n-1)+fibonacci(n-2);
5 }

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 结果为 五

输入    new Date(1409894060000), ‘yyyy-MM-dd HH:mm:ss 星期w‘

输出    2014-09-05 13:14:20 星期五

 1 function formatDate(t,str){
 2   var obj = {
 3     yyyy:t.getFullYear(),
 4     yy:(""+ t.getFullYear()).slice(-2),
 5     M:t.getMonth()+1,
 6     MM:("0"+ (t.getMonth()+1)).slice(-2),
 7     d:t.getDate(),
 8     dd:("0" + t.getDate()).slice(-2),
 9     H:t.getHours(),
10     HH:("0" + t.getHours()).slice(-2),
11     h:t.getHours() % 12,
12     hh:("0"+t.getHours() % 12).slice(-2),
13     m:t.getMinutes(),
14     mm:("0" + t.getMinutes()).slice(-2),
15     s:t.getSeconds(),
16     ss:("0" + t.getSeconds()).slice(-2),
17     w:[‘日‘, ‘一‘, ‘二‘, ‘三‘, ‘四‘, ‘五‘, ‘六‘][t.getDay()]
18   };
19   return str.replace(/([a-z]+)/ig,function($1){return obj[$1]});
20 }

8.如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2

输入    ‘hello world, 牛客‘, false

输出    17

 1 function strLength(s, bUnicode255For1) {
 2     if( bUnicode255For1 ){
 3         return s.length;
 4     }else{
 5         var len = s.length;
 6         for( var i=0; i<s.length; i++ ){
 7             if( s.charCodeAt(i) > 255 ){
 8                 len++;
 9             }
10         }
11         return len;
12     }
13 }

9.判断输入是否是正确的邮箱格式

输入    邮箱字符串

输出    true表示格式正确

1 function isAvailableEmail(sEmail) {
2     var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;
3     return reg.test(sEmail);
4 }

10.将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1). rgb 中每个 , 后面的空格数量不固定
2). 十六进制表达式使用六位小写字母
3). 如果输入不符合 rgb 格式,返回原始输入

输入    ‘rgb(255, 255, 255)‘

输出    #ffffff

 1 function rgb2hex(sRGB){
 2     var result=[‘#‘];
 3     if(!/rgb\(\d+(,\s*\d+){2}\)/.test(sRGB)){
 4         return sRGB;
 5     }
 6     sRGB.replace(/\d+/g,function($0){
 7         result.push((‘0‘+(+$0).toString(16)).slice(-2));
 8     });
 9     return result.join(‘‘);
10 }

11.css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
1). 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2). -webkit-border-image 转换后的结果为 webkitBorderImage

输入    ‘font-size‘

输出    fontSize

1 function cssStyle2DomStyle(sName) {
2     return sName.replace(/(?!^)\-(\w)(\w+)/g, function(a, b, c){
3             return b.toUpperCase() + c.toLowerCase();
4         }).replace(/^\-/, ‘‘);
5 }

12.统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
1). 不限制 key 的顺序
2). 输入的字符串参数不会为空
3). 忽略空白字符

输入    ‘hello world‘

输出    {h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}

1 function count(str) {
2     var obj = {};
3     str.replace(/\S/g,function(s){
4         !obj[s]?obj[s]=1:obj[s]++;
5     })
6     return obj;
7 }
时间: 2024-10-27 12:55:07

牛客网——前端大挑战的相关文章

牛客网在线判题系统JavaScript(V8)使用

JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢JavaScript这门编程语言,同时对数据结构与算法感兴趣,当然可以使用这门语言去刷编程题. 大家有没有跟我碰到过和我类似的情况,在牛客网刷编程题的时候,编译器提供的是Javascript(v8 6.0.0),在线编程部分前端编程还好,只用在题目给出的函数中补充就行.但苦恼的是,我们不知道如何像C

网易2017秋招编程题集合_以下代码全部来自牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列.现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和).现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列. 链接:https://ww

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子

牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher(迪杰斯特拉乱用) H.老子的全排列呢(dfs)

菜哭了... A.石油采集 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 链接:https://www.nowcoder.com/acm/contest/76/A来源:牛客网 题目描述 随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业.如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光.这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形.(上下相

牛客网华为机试训练第3题 明明的随机数

今天花了一下午才把明明的随机数这个搞明白,期间和牛客网的编译器殊死搏斗.一直发现在本地编译器运行成功,但是在牛客上的老师不能通过.整的十分的恼火和焦躁.后来看到了相同的问题,才发现解决之道. 时间限制:1秒 空间限制:32768K 热度指数:222608 本题知识点: 数组 算法知识视频讲解 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不

牛客网-求和

题目描述 输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 输入描述: 每个测试输入包含2个整数,n和m 输出描述: 按每个组合的字典序排列输出,每行输出一种组合 示例1 输入 5 5 输出 1 4 2 3 5 #include<iostream> #include<string> #include<vector> #include<algorithm> using namespac

网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50来源:牛客网 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一

【华为机试】找最高分(通过此题熟悉牛客网Node输入输出)

来源:牛客网 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据.每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目.学生ID编号从1编到N.第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'的时候

好未来2017秋招笔试真题二 --牛客网

好未来2017秋招笔试真题二 --牛客网 链接:https://www.nowcoder.com/questionTerminal/ee5de2e7c45a46a090c1ced2fdc62355来源:牛客网 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I 输入描述: 每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100 输出描述: 依次输出倒置之后的字符串,以空格分割 输入例子: I