js高级脚本算法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值