js高级脚本算法

来源:互联网 发布:log4j linux 绝对路径 编辑:程序博客网 时间:2024/06/07 07:26

1.判断电话号码算法挑战

function telephoneCheck(str) {// Good luck! var matchStr = /^(((1(\s|))|)\([1-9]{3}\)(\s|-|)[1-9]{3}(\s|-|)[1-9]{4})$/;  var matchStr2 = /^(((1(\s)|)|)[1-9]{3}(\s|-|)[1-9]{3}(\s|-|)[1-9]{4})$/;  return (str.match(matchStr) != null||str.match(matchStr2)!=null);}

2集合交集算法挑战

集合交集算法挑战function sym(args) {    var arr=[];     var a=arguments[0];     var len=arguments.length;    for(var i=1;i<len;i++){        var b=arguments[i];        arr=a.filter(function(item){            return b.indexOf(item)<0;        });        var d=b.filter(function(item){            return a.indexOf(item)<0;        });        arr=arr.concat(d);         a=arr;    }    arr=unique(arr);return arr;}function unique (arr) {  return Array.from(new Set(arr))}

3收银系统算法挑战

function checkCashRegister(price, cash, cid) {   // 刚刚好    if(price==cash){      return "No Need Back";    }    // 付款不足    if (price > cash){      return "Need More Money";    }    var base=100;//金额基数    var change=(cash-price)*base; //找零    //定义一个函数,用来求零钱和。    var getTotalMoney=function(arr){        var totalMoney=0;        arr.reduce(function (preV, currV, currIndex, array){            totalMoney+=base*(preV[1]+currV[1]);            return currV;        });//叠代算法:求零钱之和。        return totalMoney;    }    //余额不足,没法找了    var remain = getTotalMoney(cid);    if (remain==change){//如果零钱数等于应找数额,返回closed        return "Closed";        }else if(remain < change){//没钱找了        return "Insufficient Funds";    };    // 对应:1角-5角-1元-5元-10元-20元-50元-100元(以元为单位的基础上乘以面值基数:base这里为100)    var dollar= [1, 5, 10, 25, 100, 500, 1000, 2000, 10000]; // TODO    var pay={};//保存的key:dollar中面值索引,value:要找的此面值的个数    var currLast=0;// 当前面值所剩余额    var currMoney=0;//当前金钱面额(dollar中对应的值)    for (var i=dollar.length-1;i>=0;i--){//由大到小循环        //当前面值剩余金额        currLast=cid[i][1]*base;              if (currLast<=0) {             continue;//当前面值的金额剩余0,跳过        }        //当前金额面值        currMoney=dollar[i];        // 在当前面值下取钱必须同时满足两个条件:        // 1. 找零必须大于当前面值,比如找零51元,才可以从50里面取钱。        // 2. 剩余的当前面值的总额足够,比如找4元,但我只有3张1元,就不符合取钱条件        if(change>currMoney){//如果当前金额面值小于应找钱数            if(change<currLast){                 // 找零小于当前面值剩余金额:比如找钱51元,当前50面值总额余额还有150元。                pay[i]=Math.floor(change/currMoney);//取最大张数                change-=currMoney*pay[i];//取完之后从应找余额中减去(张数x面值)            }else{                // 找零大于当前面值剩余金额,比如找零51元,我50元面额总值只有50元                // 则将所有剩余金额找出                pay[i]=Math.floor(currLast/currMoney);                change-=currLast;//就直接减去当前面值剩余所有金额            }        }    }//循环结束之后得到一个pay对象,里面包括了面值和对应应找的钱。    console.log(pay)    var res=[];    // 组织最后需要找零的钱,作为最终返回的数组。    var keys=Object.keys(pay);//找到pay对象    var idx=0;    var total=0;//应找零钱(pay)的总额    for (var j=0; j<keys.length; j++) {        // 需要找零的面值索引:比如100,50,20,10...等等        idx=parseInt([keys[j]]);        //计算该面值最后找出的零钱(公式:面值x需要找出数量 / 金钱面值基数)        cid[idx][1]=dollar[idx]*pay[keys[j]]/base;        res.unshift(cid[idx]);//把结果添加到数组的开头。符合由面值大到小的规律。        total += dollar[idx]*pay[keys[j]];         // 顺便计算下这里计算的结果应该和最开始需要找零的金额一致:        // 面值x需要找出数量——返回到total结果中    }     // 找到最后,所有能找的面值加起来还不够    // 这里与最开始不同,这里是过滤掉了所有找不开的面值    // 比如:要找0.05元,但是目前剩余一张0.01和1元的面值,依旧判定为找不开    // 而最开始的是所有余额加起来都不够找    if (total<change) {        return "Insufficient Funds";    }    console.log(res)    return res;}

4库存更新算法挑战

function updateInventory(arr1, arr2) {// All inventory must be accounted for or you're fired!var arr1key = arr1.map(function(v){     return v[1];   });  arr2.forEach(function(v){    if (arr1key.indexOf(v[1]) === -1) {      arr1.push(v);    } else {      arr1[arr1key.indexOf(v[1])][0] += v[0];    }  });  return arr1.sort(function(a,b){    return a[1].charCodeAt(0) - b[1].charCodeAt(0);  });}

5日期改写算法挑战

function makeFriendlyDates(arr) {   //获得目前的年份 var yearnow=(new Date()).getFullYear(); //把传入的参数放入字符串数组,创建Date类型也可以 var date1=arr[0].split("-"); var date2=arr[1].split("-"); //月份的英文表示 var months=["January","February","March","April","May","June","July","August","September","October","November","December"]; //初始化几个后面用到的数组 var date1str=""; var date2str=""; var datearr=[]; //给日期加后缀的函数 function friendlydate(str){  var str2num=Number(str);  switch(str2num){   case 1:    str2num+="st";    break;   case 2:    str2num+="nd";    break;   case 3:    str2num+="rd";    break;   default:    str2num+="th";  }  return str2num; } //date1的字符串表示大部分情况下都是需要年月日的。date2的如果不是在同年同月,大部分情况下都是需要月日的 date1str=months[date1[1]-1]+" "+friendlydate(date1[2])+", "+date1[0]; if(date1[1]===date2[1]&&date1[0]===date2[0]){  date2str=friendlydate(date2[2]); }else{  date2str=months[date2[1]-1]+" "+friendlydate(date2[2]); } //如果大于一年,date2加上年份;如果小于一年,而且date1的日期是今年,那么去掉date1的年份。 if((date2[0]-date1[0]>1)||((date2[0]-date1[0]===1)&&(date2[1]-date1[1]>0))||((date2[0]-date1[0]===1)&&(date2[1]-date1[1]===0)&&date2[2]-date1[2]>=0)){  date2str+=", "+date2[0]; }else if(date1[0]==yearnow){  date1str=date1str.slice(0,-6); } //把两个日期放在同一个数组里输出(如果是同年同月同日,代码里的date2str无用,所以代码是可以改善的)。 datearr[datearr.length]=date1str; if(date1.toString()!==date2.toString()){  datearr[datearr.length]=date2str; } return datearr;}

6类及对象构建算法挑战

var Person = function(firstAndLast) {   var firstAndLastarr=firstAndLast.split(" "),     firstName=firstAndLastarr[0],    lastName=firstAndLastarr[1];    this.getFirstName=function(){      return firstName;    };    this.getLastName=function(){      return lastName;    };    this.getFullName=function(){      firstAndLastarr[0]=firstName;      firstAndLastarr[1]=lastName;      return firstAndLastarr.join(" ");    };    this.setFirstName=function(first){     firstName=first;    };    this.setLastName=function(last){      lastName=last;    };    this.setFullName=function(firstAndLast){    firstAndLastarr=firstAndLast.split(" ");    firstName=firstAndLastarr[0];    lastName=firstAndLastarr[1];    };};

7轨道周期算法挑战

function orbitalPeriod(arr) {var GM = 398600.4418;var earthRadius = 6367.4447;for(var i=0;i<arr.length;i++){    var R=arr[i].avgAlt+earthRadius;    var T=R*2*Math.PI*Math.sqrt((R/GM));    delete arr[i].avgAlt;    arr[i].orbitalPeriod=Math.round(T);  }  return arr;}

8数据组合求值算法挑战

function pairwise(arr, arg) {    var l=arr.length;    res=0;  for(var i=0;i<l;i++){    for(var j=i+1;j<l;j++){      if(arr[i]+arr[j]===arg){        res=res+i+j;        arr[i]="false";        arr[j]="false";      }    }  }  return res;}
原创粉丝点击