FreeCodeCamp高级算法Advance Algorithm Scripting
来源:互联网 发布:淘宝小产品拍摄技巧 编辑:程序博客网 时间:2024/06/05 03:36
1.0 Validate US Telephone Numbers
/*
* 如果传入字符串是一个有效的美国电话号码,则返回 true.
正则表达式
^1?表示以1开头,1匹配0次或1次
\d{3}匹配一个0-9的数字三次
(\d{3})匹配(一个0-9的数字三次),比上面多一个括号,左右括号分别需要加上转义字符\
\s?表示空白字符匹配0次或1次
[ -]?表示空格或者连字符-匹配0次或1次
\d{4}
* */
function telephoneCheck(str) { var re=/^1?\s?(\d{3}|\(\d{3}\))[ -]?\d{3}[ -]?\d{4}$/; return re.test(str);}
2.0 Symmetric Difference
function sym(args) {// 将参数转化为数组 var arr = Array.prototype.slice.call(arguments);// 过滤每个数组中重复的元素arr.forEach(function(i){ // 拿第一个元素和后面的元素比较,相同的就删除,以此类推 for(var j = 0; j < i.length - 1; j++){ for(var k = j+1; k<i.length; k++) if(i[j] == i[k]){ i.splice(j,1); j--; //重新定位J的位置 } }});// 两个数组进行比较,得出不同的部分arr.reduce(function(prev,cur,index,array){ prev.forEach(function(m){ if(cur.indexOf(m)==-1) cur.push(m); else cur.splice(cur.indexOf(m),1); }); return cur;});return arr[arr.length-1];}
3.0 Exact Change 不乘以100,算出来的结果有误差,应该是小数位的保留不正确,不想乘以100的话,注意保留两位小数
function checkCashRegister(price, cash, cid) {cid = cid.map(function(val){ return val.map(function(tar){ if (!isNaN(tar)) { return tar * 100; } return tar; });});price = price * 100;cash = cash * 100;// 计算应找回的钱var money = cash - price;// 1分 5分 1角 0.25角 1元 5元 10元 20元 100元 零钱数组对应的二维数组级别// var arr = [0.01, 0.05, 0.1, 0.25, 1, 5, 10, 20, 100];var arr = [1, 5, 10, 25, 100, 500, 1000, 2000, 10000];// 最大的面值var level = 0;arr.map(function (val, index, arr) { if (money >= val) { level = index; }});// 判断是否有足够的钱找回var allMoney = 0;for (var i = 0; i <= level; i++) { allMoney += cid[i][1];}// 钱不够找if (allMoney < money) { return "Insufficient Funds";}// 钱刚好够if (allMoney == money) { return "Closed";}// 应该返回的结果数组var result = [];// 从最大面值开始找钱,直到找完for (var j = level; j >= 0; j--) { if(money === 0) break; // 是否刚好够整数 var isCom = money % arr[j]; // 刚好够找,不用继续往下 if (isCom === 0 && money <= cid[j][1]) { var arr2 = []; arr2.push(cid[j][0]); arr2.push(money); result.push(arr2); // 除以100 result = result.map(function(val1){ return val1.map(function(tar1){ if (!isNaN(tar1)) { return tar1 / 100; } return tar1; }); }); return result; } // 最大面值张数 var times = Math.floor(money / arr[j]); if (times === 0) { continue; } var money2 = times * arr[j]; // 超过最大面值的总金额 if (money2 > cid[j][1]) { result.push(cid[j]); // 余额 money = money - cid[j][1]; } else { var arr3 = []; arr3.push(cid[j][0]); arr3.push(money2); result.push(arr3); // 余额 money = money - money2; }}// 除以100result = result.map(function(val1){ return val1.map(function(tar1){ if (!isNaN(tar1)) { return tar1 / 100; } return tar1; });});return result;}
4. Inventory Update
function updateInventory(arr1, arr2) {// 如果arr2为空,直接返回arr1if (arr2.length <= 0) { arr1.sort(function (a, b) { return a[1] > b[1]; }); return arr1;}if (arr1.length <= 0) { arr2.sort(function (a, b) { return a[1] > b[1]; }); return arr2;}// 判断是否存在相同的var arr = [];arr2.map(function (val) { for (var i = 0; i < arr1.length; i++) { var isHave = arr1[i].indexOf(val[1]); if (isHave >= 0) { arr1[i][0] = arr1[i][0] + val[0]; break; } if (i === arr1.length -1) { arr.push(val); } }});arr.map(function(val1){ arr1.push(val1);});arr1.sort(function (a, b) { return a[1] > b[1];});return arr1;}
5. No repeats please
function permAlone(str) {var arr=str.split("");var perarr=[];var begin=0;//创建正则,如果字符串全重复,则直接return 0var reg = /(.)\1+/g;if(str.match(reg)!==null&&str.match(reg)[0]===str){ return 0;}//用于交换的函数function swap(idx1,idx2){ var temp=arr[idx1]; arr[idx1]=arr[idx2]; arr[idx2]=temp;}//如果begin到了最后一个字符,可以将这个字符串加入到全排列数组中了function permall(arr,begin){ if(begin==arr.length-1){ perarr[perarr.length]=arr.join(""); return; } for(var i=0;(i+begin)<arr.length;i++){ swap(begin,begin+i); permall(arr,begin+1); swap(begin,begin+i); }}permall(arr,begin);//返回相邻不重复的数量return perarr.filter(function(val) { return !val.match(reg);}).length;}
6.0 Friendly Date Ranges , 这道题答案不正确 ,思路比较简单,就是根据不同的条件进行返回
function makeFriendlyDates(arr) {var firstArr = arr[0].split('-');var lastArr = arr[1].split('-');// 不符合if (firstArr[0] > lastArr[0]) { return undefined;}if (firstArr[1] > lastArr[1]) { return undefined;}if (firstArr[2] > lastArr[2]) { return undefined;}// 月份数组var monthArr = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];// 日var dayArr = ["st", "en", "rd"];// 同年同月同日if (firstArr[0] === lastArr[0] && firstArr[1] === lastArr[1] && firstArr[2] === lastArr[2]) { // 获取月份 var monthStr = monthArr[parseInt(firstArr[1] - 1)]; // 日期 var dayF = parseInt(firstArr[2]); var dayFstr = dayString(dayF); return [monthStr + ' ' + dayFstr + ' ' + firstArr[0]];}// 同年同月if (firstArr[0] === lastArr[0] && firstArr[1] === lastArr[1]) { // 获取月份 var monthStr = monthArr[parseInt(firstArr[1] - 1)]; // 日期 var dayF = parseInt(firstArr[2]); var dayL = parseInt(lastArr[2]); var dayFstr = dayString(dayF); var dayLstr = dayString(dayL); return [monthStr + ' ' + dayFstr, dayLstr];}// 同年不同月if (firstArr[0] === lastArr[0]) { // 获取月份 var monthStrF = monthArr[parseInt(firstArr[1] - 1)]; var monthStrL = monthArr[parseInt(lastArr[1] - 1)]; // 日期 var dayF = parseInt(firstArr[2]); var dayL = parseInt(lastArr[2]); var dayFstr = dayString(dayF); var dayLstr = dayString(dayL); return [monthStrF + ' ' + dayFstr, monthStrL + ' ' + dayLstr];}// 相差一年, 前一年的天 > 后一年的天 ,只有前面的有年份if (lastArr[0] - firstArr[0] === 1 && firstArr[2] > lastArr[2]) { // 获取月份 var monthStrF = monthArr[parseInt(firstArr[1] - 1)]; var monthStrL = monthArr[parseInt(lastArr[1] - 1)]; // 日期 var dayF = parseInt(firstArr[2]); var dayL = parseInt(lastArr[2]); var dayFstr = dayString(dayF); var dayLstr = dayString(dayL); return [monthStrF + ' ' + dayFstr + "," + ' ' + firstArr[0], monthStrL + ' ' + dayLstr];}// 都不一样// 获取月份var monthStrF = monthArr[parseInt(firstArr[1] - 1)];var monthStrL = monthArr[parseInt(lastArr[1] - 1)];// 日期var dayF = parseInt(firstArr[2]);var dayL = parseInt(lastArr[2]);var dayFstr = dayString(dayF);var dayLstr = dayString(dayL);return [monthStrF + ' ' + dayFstr + "," + ' ' + firstArr[0], monthStrL + ' ' + dayLstr + "," + ' ' + lastArr[0]];function dayString(index) { if (index == 1) { return "1st"; } if (index === 2) { return "2nd"; } if (index === 3) { return "3rd"; } if (index == 11) { return "11st"; } if (index === 12) { return "12nd"; } if (index === 13) { return "13rd"; } if (index == 21) { return "21st"; } if (index === 22) { return "22nd"; } if (index === 23) { return "23rd"; } if (index == 31) { return "31st"; } return (index + "th"); }}
7. Make a Person
var Person = function(firstAndLast) {var firstName, lastName;this.getFirstName = function() { return firstName;};this.getLastName = function() { return lastName;};this.getFullName = function() { return firstName + ' ' + lastName;};this.setFirstName = function(first) { firstName = first;};this.setLastName = function(last) { lastName = last;};this.setFullName = function(firstAndLast) { firstAndLast = firstAndLast.split(' '); firstName = firstAndLast[0]; lastName = firstAndLast[1];};// 调用this.setFullName(firstAndLast);};
8.0 Map the Debris 遍历数组,拿出对应的属性进行计算,返回数组即可,比较简单,知道计算公式就行
function orbitalPeriod(arr) {var results = [];var GM = 398600.4418, earthRadius = 6367.4447;arr.forEach(function(element) { results.push({ name: element.name, orbitalPeriod: getOrbitalPeriod(element.avgAlt, GM, earthRadius) });});return results;function getOrbitalPeriod(avgAlt, GM, planetRadius) { return Math.round(2 * Math.PI * Math.sqrt(Math.pow(avgAlt + planetRadius, 3) / GM));}}
9.0 Pairwise 找到符合条件的两个元素,然后下标相加,返回相加后的结果,注意不能重复使用相同的元素
function pairwise(arr, arg) {// 数组为空if (arr.length <= 0) return 0;// 依次拿数组中的元素遍历var resultArr = [];for (var i = 0; i < arr.length; i++) { // 已经匹配过的,不再匹配 var isHave = resultArr.indexOf(i); if (isHave > 0){ continue; } // 计算得出另一个数的大小 var tar = arg - arr[i]; // 看数组中是否存在对应的数 for (var j = i + 1; j < arr.length; j++) { // 如果已经匹配过了,就不在匹配 var isHave2 = resultArr.indexOf(j); if (isHave2 > 0){ continue; } if (arr[j] === tar) { resultArr.push(i); resultArr.push(j); break; } }}// 最后计算结果if (resultArr.length <= 0) { return 0;}return resultArr.reduce(function (pre, cur) { return pre + cur;});}
阅读全文
1 0
- FreeCodeCamp高级算法Advance Algorithm Scripting
- freecodecamp advance algorithm scripting
- Intermediate Algorithm Scripting FreeCodeCamp中级算法
- freeCodeCamp-Basic Algorithm Scripting
- freeCodeCamp任务之Basic-Algorithm-Scripting
- FCC Basic Algorithm Scripting 基础算法集
- [FreeCodeCamp-JavaScript]Basic Algorithm
- [FreeCodeCamp-JavaScript]Intermediate Algorithm
- [FreeCodeCamp-Javascript]Advanced Algorithm
- C++ algorithm advance函数
- algorithm 中advance函数
- Intermediate Algorithm Scripting (50 hours)中级算法脚本练习
- Advanced Algorithm Scripting (50 hours)Javascript进阶算法练习
- codefreecamp-Basic Algorithm Scripting
- FCC-Basic Algorithm Scripting
- FreeCodeCamp初级算法
- The Advance Crossover in Genetic Algorithm
- FCC学习笔记-(五) Basic Algorithm Scripting
- Android平台使用openGL ES 2.0实现预览摄像头数据功能
- 推荐!国外程序员整理的机器学习资源大全
- The folder is already a source folder
- POJ 1177 线段树+扫描线
- leetcode--Sort Colors
- FreeCodeCamp高级算法Advance Algorithm Scripting
- RxJava线程切换流程分析_observeOn
- vscode 集成 git bash.exe
- 写一个函数可以判断一个年份是不是闰年。
- 推荐一款好用的下拉框软件 绿色中文版
- MTK Android Driver :battery
- PHP 分支语句
- ios-代码的国际化
- Markov Chain算法笔记