newcoder problems

斐波那契数列

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

数组去重

1
2
3
Array.prototype.uniq = function () {
return Array.from(new Set(this));
}

获取url参数

问题描述

获取 url 中的参数

  1. 指定参数名称,返回该参数的值 或者 空字符串
  2. 不指定参数名称,返回全部的参数对象 或者 {}
  3. 如果存在多个同名参数,则返回数组
    如输入http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe 输出[1,2,3]

我的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function getUrlParam(sUrl, sKey) {
if(sKey){
var reg = new RegExp("[?&]"+sKey+"=(([^&#])+)","g")
var res = []
sUrl.replace(reg,function (match,s,index,str) {
console.log(match+" "+s+" "+index+" "+str)
res.push(s)
})
if(res.length=0)return "";
return res;
}
else {
var reg = new RegExp("[?&]([^&#]+)=([^&#]+)","g")
var res = {};
sUrl.replace(reg,function (match,s1,s2,index,str) {
console.log(match+" "+s1+" "+s2+" "+index+" "+str)
var t = res[s1]
if(res[s1]){
console.log(res[s1])
if(Array.isArray(res[s1])){
t.push(s2)
res[s1] = t;
}
else {
console.log("aaaaaaaaaaa")
res[s1] = new Array(t,s2)
console.log(res[s1])
}
}
else res[s1] = s2;
})
return res;
}
}

更简洁的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getUrlParam(sUrl,sKey){
    var result = {};
    sUrl.replace(/\??(\w+)=(\w+)&?/g,function(a,k,v){
        if(result[k] !== void 0){
            var t = result[k];
            result[k] = [].concat(t,v);
        }else{
            result[k] = v;
        }
    });
    if(sKey === void 0){
        return result;
    }else{
        return result[sKey] || '';
    }
}

主要区别:
1.先将所有参数投提取出来,再根据sKey区分
2.正则表达式的区别
3.字符串与新字符串合并成数组的方法[].concat(t,v)

颜色字符串转换

问题描述

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

  1. rgb 中每个 , 后面的空格数量不固定
  2. 十六进制表达式使用六位小写字母
  3. 如果输入不符合 rgb 格式,返回原始输入

输入rgb(255, 255,255) 输出#ffffff

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var res = "#";
var reg = /^rgb\(([0-9]+),\s*([0-9]+),\s*([0-9]+)\)/g;
if(!reg.test(sRGB)) return sRGB;
var f = true;
sRGB.replace(reg,function (match,s1,s2,s3) {
s1 = Number(s1);
s2 = Number(s2);
s3 = Number(s3);
s1 = parseInt(s1);
s2 = parseInt(s2);
s3 = parseInt(s3);
//console.log(`${match} ${s1} ${s2} ${s3}`);
if(s1>255 || s2>255 || s3>255){
console.log("dd")
f = false;
return ;
}
var tmp = [s1,s2,s3].map(function (t) {
t = t.toString(16);
if(t.length==1){
return '0'.concat(t)
}
return t;
})
res += tmp[0]+tmp[1]+tmp[2];
})
if(f) return res;
return sRGB;

将字符串转换为驼峰格式

问题描述

css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能

  1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
  2. -webkit-border-image 转换后的结果为 webkitBorderImage
    输入‘font-size’输出’fontSize’
1
2
3
4
5
6
7
8
9
if(sName.indexOf('-') === -1 )return sName;
if(sName[0] =='-') sName = sName.slice(1);
var reg = /-([a-z]+)/g;
/*console.log(sName.match(reg))*/
var res = sName.replace(reg,function (match,s1,s2) {
console.log(`${match} ${s1} ${s2}`)
return s1[0].toUpperCase()+s1.slice(1)
})
return res;