美文网首页
聊聊w3c刷题遇到的小坑

聊聊w3c刷题遇到的小坑

作者: lhyt | 来源:发表于2018-02-08 15:31 被阅读0次

    本文是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

    相关文章

      网友评论

          本文标题:聊聊w3c刷题遇到的小坑

          本文链接:https://www.haomeiwen.com/subject/pweozxtx.html