最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS | 教练,我想做习题19

    正文概述 掘金(毛小悠)   2021-03-24   533

    ? 前言

    大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

    本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。???

    以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

    可以在下方评论区留言或者加我的微信:code_maomao。期待你的到来。

    求关注求点赞?~~~???

    ? 题目1:什么不属于这些?

    编写一个方法,该方法接受一个元素数组并返回不属于这些元素的元素。

    例:

    [1, 2, 2, 2, 2] -> 1
    ['1', 2, '4', '6', '8'] -> 2
    [2, 2, -2, 6, 10] -> -2
    ['a', 'a', 'b', 'a', 'a', 'a', 'a'] -> 'b'
    

    元素只能是以下类型: boolean,char(或在JS / TS中为一个字符的字符串)或int(在JS / TS中为数字)。 该数组永远不会为空,并且数组中始终会有两个以上的值!

    它总是恰好是一个元素,不属于其他元素。 数组中的值永远不会为null或undefined或0。

    习题代码:

    function findTheNotFittingElement(series)
    {
      return null;
    }
    

    答案

    ? 题目1的答案

    参考答案1:

    function findTheNotFittingElement(series)
    {
      let arrOut = [];
      let arrChecks = [checkValue,checkType,checkEven,checkSign,checkStrVal,checkCase,checkAlphaNum]
      
      // Filter the array using various functions in arrChecks applied to the series. Looking for a single element to provide distinct response to filter.
      for(let j = 0; j < arrChecks.length; j++){
        arrOut.push(series.filter(function(element,i){
          if(i === 0){
            return arrChecks[j](element) !== arrChecks[j](series[1]) && arrChecks[j](element) !== arrChecks[j](series[2]);
          } else if(i === 1){
            return arrChecks[j](element) !== arrChecks[j](series[0]) && arrChecks[j](element) !== arrChecks[j](series[2]);
          } else {
            return arrChecks[j](element) !== arrChecks[j](series[i-2]) && arrChecks[j](element) !== arrChecks[j](series[i-1]);
          }
        }));
      }
    
      function checkValue(x){
        return x;
      }
      
      function checkType(x){
        return typeof x;
      }
      
      function checkEven(x){
        return x%2;
      }
      
      function checkSign(x){
        return x/Math.sqrt(x*x)
      }
      
      function checkStrVal(x){
        return isNaN(x);
      }
      
      function checkCase(x){
        return x.toString().match(/[a-z]+/);
      }
      
      function checkAlphaNum(x){
        return x.toString().match(/[^a-z0-9]/i);
      }
    
      // Returning the first array where only one element is differentiated by a test filter.
      return arrOut[arrOut.findIndex(function(element){return element.length === 1})][0];
    }
    

    参考答案2:

    function findTheNotFittingElement(s){
      // |----->at least two type<-----|   |--------->check out the unique type<---------|
      if(s.some(x=>typeof x!=typeof s[0])&&(t=check(x=>typeof x!=typeof s[0]))!="Failed!") return t
      // |-->only one value is not equals to s[0]<--|         |--->search it out<---|
      if((t=s.filter(x=>x===s[0])).length==s.length-1) return s.filter(x=>x!=s[0])[0]
      // |-->only one value is not equals to s[1]<--|         |--->search it out<---|
      if((t=s.filter(x=>x===s[1])).length==s.length-1) return s.filter(x=>x!=s[1])[0]
      //   |---->   even number   <----| |---->    odd number   <----||---> negative <---||---> positive <--||-----> zero <----| |----->    string number    <-----||----->     lowercase letter    <-----||----->    uppercase letter    <-----| |----->   is letter or not    <-----||-----> execute each func     <-----| 
      tmp=[x=>typeof x=='number'&&x%2==0,x=>typeof x=='number'&&x%2==1,x=>Math.sign(x)==-1,x=>Math.sign(x)==1,x=>Math.sign(x)==0,x=>typeof x=='string'&&/\d/.test(x),x=>typeof x=='string'&&/[a-z]/.test(x),x=>typeof x=='string'&&/[A-Z]/.test(x),x=>typeof x=='string'&&/\w/.test(x)].some(f=>{if((t=check(f))!="Failed!") {r=t;return true}})
      return r
      
      function check(f){ 
        var t=s.filter(f)
      //      |->unique found<-||--------->  duplicate found   <---------||->nothing found<-|
        return t.length==1?t[0]:t.length==s.length-1?s.filter(x=>!f(x))[0]:    "Failed!"
      }
    }
    

    参考答案3:

     function findTheNotFittingElement(series){
            console.log(series)
            
    let len = series.length-1;
          
    let odd1 = [], odd2 =  [], odd3 = [], odd4 = [], odd5 = [], odd6 = [], odd7 = [], odd8 = [], odd9 = [], odd10 = [], odd11 = [], odd12 = [], odd13 = [], odd14 = [], odd15 = [], odd16 = [], odd17 = [], odd18 = [], odd19 = [], odd20 = [];
            
    let ser = series.map((x,i) => x ); let serRev = series.reverse().map((x,i) => x );
    
    let difType = series.map((x,i) => typeof ser[i-1] == typeof x || typeof ser[i+1] == typeof x || typeof ser[i+2] == typeof x || typeof ser[i-2] == typeof x  ? "" : odd2.push(i) ) 
    
    
    let bool = series.map((x,i) => Boolean(x) == Boolean(ser[i-1]) || Boolean(x) == Boolean(ser[i+1])  ? " " : odd3.push(i)) 
    
    let alpNum = series.map((x,i) => /[a-z]/gi.test(x) == true ? '' : odd4.push(i) )
    
    let difTypeRev = series.reverse().map((x,i) => typeof serRev[i-1] == typeof x || typeof serRev[i+1] == typeof x || typeof serRev[i-2] == typeof x || typeof serRev[i+2] == typeof x  ? "" : odd5.push(i) )
    
    let boolRev = series.reverse().map((x,i) => Boolean(x) == Boolean(serRev[i-1]) || Boolean(x) == Boolean(serRev[i+1]) ? " " : odd6.push(i))
    
    let neg = series.map((x,i) => Math.sign(x) == -1 ? odd7.push(i) : odd8.push(i) ) 
    
    let evenNum = series.map((x,i) => typeof x == 'number' && x % 2 == 0 ? odd9.push(i) : typeof x == 'number' && x % 2 != 0 ? odd10.push(i) : '' ) 
                                            
    let capA = series.map((x,i) =>  /[a-z]/.test(x) == true ? odd11.push(i) : /[A-Z]/.test(x) == true ? odd12.push(i) : '' )
    
    let oneDifStrAlt = series.map((x,i) => x == ser[i-1] || x == ser[i+1] || x == ser[i-2] || x == ser[i+2] ? odd13.push(i) : '') 
    
    let noDup = series.map((x,i) => typeof x == 'string' && series.indexOf(x) ? odd15.push(i): typeof x == 'string' && !series.indexOf(x)?odd16.push(i):'') 
    
    let numOnly = series.map((x,i) => typeof x == 'number' && x === ser[i-1] || typeof x == 'number' && x === ser[i+1] ? odd17.push(i) : '') 
    
    let tr = []; let fa = [];
    
    let trueFalse =  series.map((x,i) => x == false ? fa.push(i) : x == true ? tr.push(i) : '')
    
    let ma = []; let mi = [];
           
    let maxMin =  series.map((x,i) => {if (x == Math.max(...ser)) ma.push(i)
                                      if (x == Math.min(...ser)) mi.push(i)})
                                        
           
    if (odd1.length == 1) {return series[odd1[0]]}
    if (odd2.length == 1) {return series[odd2[0]]}      
    if (odd3.length == 1) {return series[odd3[0]]}
    if (odd4.length == 1) {return series[odd4[0]]}       
    if (odd5.length == 1) {return series[odd5[0]]}      
    if (odd7.length == 1) {return series[odd7[0]]}      
    if (odd8.length == 1) {return series[odd8[0]]}
    if (odd9.length == 1) {return series[odd9[0]]}       
    if (odd10.length == 1) {return series[odd10[0]]}
    if (odd11.length == 1) {return series[odd11[0]]}       
    if (odd12.length == 1) {return series[odd12[0]]}        
    if (odd14.length == 1) {return series[odd14[0]]}              
    if (odd15.length == 1) {return series[odd15[0]]}    
    if (odd16.length == 1) {return series[odd16[0]]}        
    if (odd17.length == 1) {return series[odd17[0]]}    
    if (odd18.length == 1) {return series[odd18[0]]}    
    if (odd19.length == 1) {return series[odd19[0]]}    
    if (odd20.length == 1) {return series[odd20[0]]}        
           
    if  (tr.length == 1) {return series[tr[0]]}    
    if  (fa.length ==1 ) {return series[fa[0]]}        
    
    if  (ma.length == 1) {return series[ma[0]]}    
    if  (mi.length == 1) {return series[mi[0]]} 
           
    
    }
    

    参考答案4:

    const findTheNotFittingElement = series => {
      let result, oddOne, iUnique = 0;
      // check typeOfCheck;
      const typeOfCheck = series.map(x => typeof x).reduce((acc, curr) => (acc[curr] ? acc[curr]++ : acc[curr] = 1, acc), {}); // acc as in = 1, acc is the same as return acc;
      // console.log(typeOfCheck);
      for (const [key, value] of Object.entries(typeOfCheck)) {
        if (value === 1) oddOne = key;
      }
      result = series.filter(x => typeof x === oddOne);
      if (result.length > 0) return result[0];
      // check oddOneOut;
      const oddOneOut = series.reduce((acc, curr) => (acc[curr] ? acc[curr]++ : acc[curr] = 1, acc), {});
      for (const [key, value] of Object.entries(oddOneOut)) {
        if (value === 1) oddOne = key, iUnique++;
      }
      if (iUnique === 1) {
        if (/false/.test(oddOne)) return false;
        if (/true/.test(oddOne)) return true;
        if (/\d/.test(oddOne)) return +oddOne;
        return oddOne;
      };
      // check odd;
      if (series.every(i => typeof i === 'number' && i > 0)) return series.filter(x => x % 2)[0];
      // check negative or positive;
      if (series.filter(i => typeof i === 'number' && i >= 0).length > series.filter(i => typeof i === 'number' && i < 0).length) {
        return series.filter(i => typeof i === 'number' && i < 0)[0];
      } else if (series.filter(i => typeof i === 'number' && i >= 0).length < series.filter(i => typeof i === 'number' && i < 0).length) {
        return series.filter(i => typeof i === 'number' && i >= 0)[0];
      }
      // check strings;
      const sLength = series.length;
      const caps = (series.join('').match(/[A-Z]/g) || [] );
      const nonCaps = (series.join('').match(/[^A-Z]/g) || []);
      const lows = (series.join('').match(/[a-z]/g) || []);
      const nonLows = (series.join('').match(/[^a-z]/g) || []);
      const digits = (series.join('').match(/\d/g) || []);
      const nonDigits = (series.join('').match(/[^\d]/g) || []);
      const dots = (series.join('').match(/\W/g) || []);
      const nonDots = (series.join('').match(/[^\W]/g) || []);
      if (sLength - caps.length === 1) return nonCaps[0];
      if (sLength - lows.length === 1) return nonLows[0];
      if (sLength - digits.length === 1) return nonDigits[0];
      if (sLength - dots.length === 1) return nonDots[0];
      if (digits.length === 1 && lows.length === 1) return digits[0]
      if (dots.length === 1) return dots[0]
    }
    

    参考答案5:

    function findTheNotFittingElement(series)
    {
    console.log(`series=(${series.join(",")})`);
      if(!series || series.length<3) {
        return null;
      }
      
      const values = new Map();
      const types = new Map();
      const numbers = new Map();  
      const cases = new Map();
      const alphas = new Map();
      const evens = new Map();
      const signs = new Map();
      
      for(let i=0; i<series.length; i++) {
         
         let arr;
         
         const v = series[i];     
         arr = values.get(v) || [];
         arr.push(v);
         values.set(v, arr);
         
         const type = typeof v;
         arr = types.get(type) || [];
         arr.push(v);
         types.set(type, arr);
         
         let isEven=false;
         let isNumber=false;
         let isNegative=false;
         const n = Number.parseInt(v);
         if(n!==NaN) {
            isNumber=true;
            if(n % 2 === 0) {
               isEven=true;
            }
            arr = evens.get(isEven) || [];
            arr.push(v);
            evens.set(isEven, arr);
            
            if(n<0) {
              isNegative=true;
            }
            arr = signs.get(isNegative) || [];
            arr.push(v);
            signs.set(isNegative, arr);
         }
         arr = numbers.get(isNumber) || [];
         arr.push(v);
         numbers.set(isNumber, arr);
         
         let isAlpha=false;
         let cse;
         if( v>='a' && v<='z' ) {
           cse='low';
         }
         if( v>='A' && v<='Z' ) {
           cse='high';
         }
         
         if(cse!==undefined) {
           arr = cases.get(cse) || [];
           arr.push(v);
           cases.set(cse, arr);
           
           isAlpha = true;
         }
         
         arr = alphas.get(isAlpha) || [];
         arr.push(v);
         alphas.set(isAlpha, arr);              
      }
      
      for(let [a,b] of [ ["types",types], ["numbers", numbers], ["alphas",alphas], ["cases",cases], ["evens",evens], ["signs",signs], ["values",values] ]) {
      console.log(a);
      console.dir(b);
         vv = checkMap(b);
         if(vv!==undefined) {
           return vv;
         }
      }
      
      return undefined;
    }
    
    function checkMap(map) {
      const keys = [...map.keys()];
      if(keys.length===2) {
         const [type1, type2] = keys;
         console.log("type1,type2 = ",type1, type2);
         const arr1 = map.get(type1);
         const arr2 = map.get(type2);
    console.log(`arr1= ( ${arr1.join(",")} ) arr2=(${arr2.join(",")})`);     
         if(arr1.length===1) {
            return arr1[0];
         }
         if(arr2.length===1) {
            return arr2[0];
         }
      }
      return undefined;
    }
    

    ?后序

    本系列会定期更新的,题目会由浅到深的逐步提高。

    求关注求点赞 ?~~???

    可以关注我的公众号:前端毛小悠。欢迎阅读 JS | 教练,我想做习题19


    起源地下载网 » JS | 教练,我想做习题19

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元