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;
}