聊聊w3c刷题遇到的小坑

2018-02-08  本文已影响0人  lhyt

本文是lhyt本人原创,希望用通俗易懂的方法来理解一些细节和难点。转载时请注明出处。文章最早出现于本人github

0. 前言

近来很多人来问,去哪里刷题啊,我毫不犹豫回答w3c和牛客网,适合入门和进阶。然后,一些人就说了一些看起来好像能过却总是过不了的题目,于是我去试一下,大概找到一些对于新人进阶遇到的可能有点小坑的题目。

1.正题

1.1删除数组中特定值算法挑战(初级)

要求:删除数组中的所有的假值。

js中,假值有false、null、0、""、undefined 和 NaN,加上本身的类型转换机制,假值最终可以转化为false!所以,一个个选的话就悲催了。

function bouncer(arr) {

for (var i = 0; i < arr.length; i++) {

if(!!arr[i] === false){

arr.splice(i,1);

i--;

}

}

return arr;

}

1.2对象搜索算法挑战(中级)

要求:写一个 function方法,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。注意:数组里面的对象出现的顺序不一定和第二个参数刚好顺序对应

我这里用了ES6的Object.entries方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键值对数组。

function where(collection, source) {

var arr = [];

var q = []

arr = collection.map(function(i){

return Object.entries(i).join()

})

_source = Object.entries(source)

var a = 0

for(var k = 0;k

for(var j = 0;j<_source.length;j++){

if(arr[k].indexOf(_source[j].join())!=-1){

a++

}

}

if(a == _source.length){

a = 0

q.push(collection[k])

}else{

a = 0

}

}

return q

}

也可以尝试JSON.stringify

1.3质数求和算法挑战(中级)

要求:求小于等于给定数值的质数之和。

这里用到了求质数的那个正则

function sumPrimes(num) {

var arr = []

var sum = 0

for (var i = 2 ;i < 1000;i++){

if(i<2?false:!/^(11+?)\1+$/.test(Array(i+1).join('1'))&&i<=num){

arr.push(i)

}

}

return arr.reduce(function(sum,n){

return sum += n

},0)

}

1.4最小公倍数算法挑战(中级)

要求:找到所提供参数的最小公倍数,这两个参数可以均匀分配,以及这些参数之间范围内的所有最小公倍数。

注意:范围是两个数字构成的数组,两个数字不一定按数字顺序排序。

主要先了解最大公倍数和最小公约数的概念以及求法

function smallestCommons(arr) {

arr.sort(function(a,b){//先排序

return a-b

})

var n = arr[0]

var arr1 = []

var res

while(n<=arr[1]){//约数集合

arr1.push(n)

n++

}

function gcd( n,m ){

var qq = n*m //缓存两个数的乘积

function yue(n,m){

if( m == 0 ) return n; //辗转相除法

return yue( m, n % m );

}

return qq/yue(n,m)//最小公倍数=乘积/最大公约数

}

res = gcd(arr1[0],arr1[1] )//保留前面两个数的结果

for(var i = 2;i < arr1.length;i++){//操作整个范围所有的数

res = gcd(res,arr1[i])

}

return res

}

1.5数组平铺算法挑战

要求:对嵌套的数组进行平铺嵌套数组。你必须考虑到不同层级的嵌套。

这道题有点难度的,主要是处理{}和[],通过类型转换处理

function steamroller(arr) {

if (typeof arr[0] != 'number') {//全字母的情况(在这里只是全数字或者全字母,准确来说需要做更详细的判断)

return Array.apply(null,arr.join(',').split(','));

} else {

arr = arr.join().replace(/(,,)/g,',').split(',').map(function(n){//【】会转为两个逗号,,要去掉一个最后空数组平铺后就会不存在

return n*1;//转数字类型,+n也是一样

});

for (var i = 0;i

if(isNaN(+arr[i])){//如果是对象,对象转数字类型结果是NaN(+{}==NaN)

arr[i] = {}

}

}

}

return arr

}

1.6函数迭代可选参数算法挑战

要求:创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。如果两个参数都不是有效的数字,则返回 undefined。

这题类似于柯里化

function add() {

var sum = 0

var arr = [...arguments]

if(!arr.every(function(i){

return typeof i ==='number'//如果两个参数都不是有效的数字

})){

return undefined

}

if(arguments.length != 1){//参数大于1个

arr.forEach(function(n){

sum+= n

})

return sum

}

sum = arguments[0]//一个参数的情况

return function(){

return typeof arguments[0] =='number'? sum += arguments[0]:undefined

}

}

原文来自lhyt的github

上一篇 下一篇

猜你喜欢

热点阅读