├── README.md ├── 初级算法 ├── 11-Slasher Flick.js ├── 1-Reverse a String.js ├── 2-Factorialize a Number.js ├── 3-Check for Palindromes.js ├── 8-Repeat a string repeat a string.js ├── 14-Seek and Destroy.js ├── 7-Confirm the Ending.js ├── 12-Mutations.js ├── 9-Truncate a string.js ├── 10-Chunky Monkey.js ├── 15-Where do I belong.js ├── 13-Falsy Bouncer.js ├── 16-Caesars Cipher.js ├── 6-Return Largest Numbers in Arrays.js ├── 4-Find the Longest Word in a String.js └── 5-Title Case a Sentence.js ├── 中级算法 ├── 16-Finders Keepers.js ├── 9-Boo who.js ├── 17-Drop it.js ├── 5-Search and Replace.js ├── 13-Sum All Odd Fibonacci Numbers.js ├── 7-DNA Pairing.js ├── 2-Diff Two Arrays.js ├── 20-Everything Be True.js ├── 6-Pig Latin.js ├── 8-Missing letters.js ├── 1-Sum All Numbers in a Range.js ├── 10-Sorted Union.js ├── 12-Spinal Tap Case.js ├── 19-Binary Agents.js ├── 21-Arguments Optional.js ├── 18-Steamroller.js ├── 14-Sum All Primes.js ├── 4-Where are you.js ├── 15-Smallest Common Multiple.js ├── 11-Convert HTML Entities.js └── 3-Roman Numeral Converter.js ├── 附件 ├── 直接插入排序.js ├── 冒泡排序.js ├── 简单选择排序.js ├── 希尔排序.js ├── 归并排序.js ├── 最小公倍数和最大公约数.js ├── 二分查找.js ├── 快速排序.js └── 全排列.js └── 高级算法 ├── 8-Map the Debris.js ├── 1-Validate US Telephone Numbers.js ├── 2-Symmetric Difference.js ├── 7-Make a Person.js ├── 9-Pairwise.js ├── 5-No repeats please.js ├── 4-Inventory Update.js ├── 3-Exact Change.js └── 6-Friendly Date Ranges.js /README.md: -------------------------------------------------------------------------------- 1 | # FreeCodeCamp 2 | freecodecamp前端训练项目解答 3 | #### 2016-6-26:算法部分更新完毕 4 | 所有解答都通过了测试,无一例外 5 | 6 | -------------------------------------------------------------------------------- /初级算法/11-Slasher Flick.js: -------------------------------------------------------------------------------- 1 | //数组截头存尾 2 | /*2016-6-19 By沐浴星光*/ 3 | function slasher(arr, howMany) { 4 | arr.splice(0,howMany); 5 | return arr; 6 | } 7 | slasher([1, 2, 3], 2); -------------------------------------------------------------------------------- /初级算法/1-Reverse a String.js: -------------------------------------------------------------------------------- 1 | // 反转字符串 2 | /*2016-6-18 By沐浴星光*/ 3 | function reverseString(str) { 4 | 5 | return str.split("").reverse().join("");//将字符串转化成数组,反转后在转化成字符串 6 | } 7 | reverseString("hello"); 8 | -------------------------------------------------------------------------------- /初级算法/2-Factorialize a Number.js: -------------------------------------------------------------------------------- 1 | //数字阶乘 2 | /*2016-6-19 By沐浴星光*/ 3 | function factorialize(num) { 4 | if (num<=1) { 5 | return 1;//0的阶乘为0,同时也是递归出口 6 | } 7 | return num*factorialize(num-1);//使用递归 8 | } 9 | 10 | factorialize(5); 11 | -------------------------------------------------------------------------------- /中级算法/16-Finders Keepers.js: -------------------------------------------------------------------------------- 1 | //查找数组中符合条件的元素 2 | function findElement(arr, func) { 3 | var num=arr.filter(function(item,index,arr){ 4 | return func(item); 5 | }); 6 | return num[0]; 7 | } 8 | 9 | findElement([1, 2, 3, 4], function(num){ return num % 2 === 0; }); -------------------------------------------------------------------------------- /中级算法/9-Boo who.js: -------------------------------------------------------------------------------- 1 | //判断一个值是否为布尔原始值 2 | 3 | function booWho(bool) { 4 | // What is the new fad diet for ghost developers? The Boolean. 5 | if(bool===false || bool===true){//使用恒等 6 | return true; 7 | }else{ 8 | return false; 9 | } 10 | } 11 | 12 | booWho(null); -------------------------------------------------------------------------------- /初级算法/3-Check for Palindromes.js: -------------------------------------------------------------------------------- 1 | //回文字符串 2 | /*2016-6-19 By沐浴星光*/ 3 | function palindrome(str) { 4 | 5 | var newStr=str.replace(/[^a-zA-Z0-9]/g,"").toLowerCase();//将非数字字母替换掉 6 | return newStr.split("").reverse().join("")===newStr;//比较反转前后是否相等 7 | } 8 | palindrome("race car"); 9 | -------------------------------------------------------------------------------- /初级算法/8-Repeat a string repeat a string.js: -------------------------------------------------------------------------------- 1 | //重复字符串 2 | /*2016-6-19 By沐浴星光*/ 3 | function repeatStringNumTimes(str, num) { 4 | var newStr=""; 5 | 6 | for (var i = num; i >0; i--) { 7 | newStr+=str; 8 | } 9 | return newStr; 10 | 11 | } 12 | 13 | console.log(repeatStringNumTimes("abc", 3)); -------------------------------------------------------------------------------- /中级算法/17-Drop it.js: -------------------------------------------------------------------------------- 1 | //从数组开头删除数组中不符合要求的元素直到遇到一个符合要求的元素, 2 | //返回这个符合要求的元素及后面的所有元素组成的数组 3 | 4 | function dropElements(arr, func) { 5 | // Drop them elements. 6 | while(func(arr[0])==false){ 7 | arr.shift(); 8 | } 9 | return arr; 10 | } 11 | 12 | dropElements([1, 2, 3], function(n) {return n < 3; }); -------------------------------------------------------------------------------- /初级算法/14-Seek and Destroy.js: -------------------------------------------------------------------------------- 1 | //查找并删除数组中特定值 2 | /*2016-6-19 By沐浴星光*/ 3 | function destroyer(arr) { 4 | var arg=Array.prototype.slice.call(arguments,1); 5 | var newArr=arr.filter(function(item,index,arr){ 6 | return arg.indexOf(item)==-1; 7 | }); 8 | return newArr; 9 | } 10 | 11 | destroyer([1, 2, 3, 1, 2, 3], 2, 3); -------------------------------------------------------------------------------- /初级算法/7-Confirm the Ending.js: -------------------------------------------------------------------------------- 1 | //确认字符串以特定子串结尾 2 | /*2016-6-19By沐浴星光*/ 3 | function confirmEnding(str, target) { 4 | var targetLength=target.length; 5 | var strLength=str.length; 6 | var substr=str.substr(strLength-targetLength,targetLength); 7 | return substr===target; 8 | } 9 | 10 | confirmEnding("Bastian", "n"); -------------------------------------------------------------------------------- /中级算法/5-Search and Replace.js: -------------------------------------------------------------------------------- 1 | //查找和替换 2 | function myReplace(str, before, after) { 3 | if (before.charCodeAt(0)<=90) {//如果首字母是大写的 4 | after=after.charAt(0).toUpperCase()+after.substring(1); 5 | } 6 | return str.replace(before,after); 7 | } 8 | 9 | console.log(myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped")); -------------------------------------------------------------------------------- /中级算法/13-Sum All Odd Fibonacci Numbers.js: -------------------------------------------------------------------------------- 1 | //求所有斐波那契数列中奇数的和 2 | function sumFibs(num) { 3 | var fib1=1,fib2=1; 4 | var sum=fib1+fib2; 5 | var next=fib1+fib2; 6 | while(next<=num){ 7 | if(next%2==1){ 8 | sum+=next; 9 | } 10 | fib1=fib2; 11 | fib2=next; 12 | next=fib1+fib2; 13 | } 14 | return sum; 15 | } 16 | sumFibs(4); -------------------------------------------------------------------------------- /初级算法/12-Mutations.js: -------------------------------------------------------------------------------- 1 | //转变 2 | /*2016-6-19 By沐浴星光*/ 3 | function mutation(arr) { 4 | var first=arr[0].toLowerCase(); 5 | var second=arr[1].toLowerCase(); 6 | for (var i = 0; i < second.length; i++) { 7 | if(first.indexOf(second[i])===-1) 8 | return false; 9 | } 10 | return true; 11 | } 12 | 13 | mutation(["hello", "hey"]); -------------------------------------------------------------------------------- /初级算法/9-Truncate a string.js: -------------------------------------------------------------------------------- 1 | //截断字符串 2 | /*2016-6-19 By沐浴星光*/ 3 | 4 | function truncateString(str, num) { 5 | 6 | if(str.length<=num){ 7 | return str; 8 | } 9 | else{ 10 | return (num<=3)?(str.slice(0,num)+"..."):(str.slice(0,num-3)+"..."); 11 | } 12 | 13 | } 14 | truncateString("A-tisket a-tasket A green and yellow basket", 11); -------------------------------------------------------------------------------- /初级算法/10-Chunky Monkey.js: -------------------------------------------------------------------------------- 1 | //数组分块 2 | /*2016-6-19 By沐浴星光*/ 3 | function chunkArrayInGroups(arr, size) { 4 | // Break it up. 5 | var newArr=[]; 6 | var index=0; 7 | while(indexarr[index++]){ 11 | } 12 | return index-1; 13 | } 14 | 15 | getIndexToIns([40, 60], 50); 16 | -------------------------------------------------------------------------------- /中级算法/8-Missing letters.js: -------------------------------------------------------------------------------- 1 | //查找丢失的字母 2 | 3 | function fearNotLetter(str) { 4 | var missing; 5 | for (var i = 0; i < str.length-1; i++) { 6 | if (str.charCodeAt(i+1)==parseInt(str.charCodeAt(i),10)+1) { 7 | continue; 8 | }else{ 9 | missing=""; 10 | missing+=String.fromCharCode(parseInt(str.charCodeAt(i),10)+1); 11 | } 12 | } 13 | return missing; 14 | } 15 | 16 | fearNotLetter("abce"); -------------------------------------------------------------------------------- /附件/直接插入排序.js: -------------------------------------------------------------------------------- 1 | var insertionSort=function (arr) { 2 | var length=arr.length; 3 | for (var i = 1; i < length; i++) { 4 | var temp=arr[i];//待插入元素 5 | var j=i; 6 | while (j>0&&temparr[j+1]) { 8 | var temp=arr[j]; 9 | arr[j]=arr[j+1]; 10 | arr[j+1]=temp; 11 | } 12 | } 13 | 14 | } 15 | return arr; 16 | } 17 | var arr=[85,24,63,45,17,31,96,50]; 18 | console.log(bubbleSort(arr)); 19 | 20 | -------------------------------------------------------------------------------- /高级算法/8-Map the Debris.js: -------------------------------------------------------------------------------- 1 | //求轨道运行周期 2 | /*2016-6-26 By沐浴星光*/ 3 | function orbitalPeriod(arr) { 4 | var GM = 398600.4418; 5 | var earthRadius = 6367.4447; 6 | 7 | for (var i = 0; i < arr.length; i++) { 8 | var orbitalPeriod=2*Math.PI*Math.pow(Math.pow(earthRadius+arr[i].avgAlt,3)/GM,0.5); 9 | delete arr[i].avgAlt; 10 | arr[i].orbitalPeriod=Math.round(orbitalPeriod); 11 | } 12 | 13 | return arr; 14 | } 15 | 16 | orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]); -------------------------------------------------------------------------------- /中级算法/12-Spinal Tap Case.js: -------------------------------------------------------------------------------- 1 | function spinalCase(str) { 2 | // "It's such a fine line between stupid, and clever." 3 | // --David St. Hubbins 4 | var pattern=/[A-Z\_]/g; 5 | return str.replace(pattern,function(match){ 6 | if (match==="_") {//将所有的下划线替换成空格 7 | return " "; 8 | }else{ 9 | return " "+match;//在所有大写字母前面添加空格 10 | } 11 | }).trim().replace(/\s+/g,'-').toLowerCase();//去掉字符串首尾空格,将空格替换成“-”,并小写 12 | 13 | 14 | 15 | } 16 | 17 | spinalCase('This Is Spinal Tap'); -------------------------------------------------------------------------------- /中级算法/19-Binary Agents.js: -------------------------------------------------------------------------------- 1 | //二进制转字符串 2 | function binaryAgent(str) { 3 | var arr=str.split(" "); 4 | var output=""; 5 | for (var i = 0; i < arr.length; i++) { 6 | var char=String.fromCharCode(parseInt(arr[i],2)); 7 | output+=char; 8 | } 9 | 10 | return output; 11 | } 12 | 13 | binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); -------------------------------------------------------------------------------- /中级算法/21-Arguments Optional.js: -------------------------------------------------------------------------------- 1 | function addTogether() { 2 | var len=arguments.length; 3 | if(len===1&&typeof arguments[0]=="number"){ 4 | var para1=arguments[0]; 5 | return function(num){ 6 | if (typeof num!=="number") { 7 | return undefined; 8 | } 9 | return num+para1; 10 | }; 11 | }else if(len===2 && typeof arguments[0]=="number"&& typeof arguments[1]=="number"){ 12 | return arguments[0]+arguments[1]; 13 | }else{ 14 | return undefined; 15 | } 16 | } 17 | 18 | console.log(addTogether(2)); -------------------------------------------------------------------------------- /附件/简单选择排序.js: -------------------------------------------------------------------------------- 1 | var selectionSort=function (arr) { 2 | var length=arr.length; 3 | for (var i = 0; i < length; i++) { 4 | var min=i;//用一个变量存储最小值下标,初始值为仍未排序的第一个元素的下标 5 | for (var j = i+1; j =1){ 5 | for (var i = gap; i < length; i++) { 6 | var j=i; 7 | var temp=arr[i]; 8 | /*对距离为gap的元素组内进行直接插入排序 9 | 下面这段是不是似曾相识,和直接排序算法如出一辙。 10 | 这不过直接排序算法的gap为1*/ 11 | while(j >=0&&temp=65&&charCode<=90){ 10 | charCodeArr.push((charCode-13)>=65?(charCode-13):(90-65-13+charCode+1));//90-[13-(charCode-65)]+1 11 | }else{ 12 | charCodeArr.push(charCode); 13 | } 14 | } 15 | 16 | return String.fromCharCode.apply(null,charCodeArr); 17 | } 18 | 19 | // Change the inputs below to test 20 | rot13("SERR PBQR PNZC"); -------------------------------------------------------------------------------- /高级算法/1-Validate US Telephone Numbers.js: -------------------------------------------------------------------------------- 1 | //验证北美电话号码的有效性 2 | /*2016-6-22 By沐浴星光*/ 3 | function telephoneCheck(str) { 4 | var pattern=/^1?\s?(\()?\d{3}(\))?[\s-]?\d{3}[\s-]?\d{4}$/; 5 | //由于JavaScript不支持条件匹配,所以,上面的正则表达式无法剔除只有单括号的情况 6 | //,这里使用了一个很巧妙的方法,在两个括号处使用了两个子表达式,下面检测只有当这两个表达式 7 | //同时匹配到或者同时没匹配到时才返回true,这样就不会出现单括号的情况了 8 | 9 | if(pattern.test(str)){ 10 | if(RegExp.$1&&RegExp.$2){ 11 | 12 | return true; 13 | }else if(!RegExp.$1&&!RegExp.$2){ 14 | return true; 15 | } 16 | else{ 17 | 18 | return false; 19 | } 20 | 21 | } 22 | 23 | return false; 24 | 25 | } 26 | 27 | 28 | telephoneCheck("555-555-5555"); -------------------------------------------------------------------------------- /中级算法/18-Steamroller.js: -------------------------------------------------------------------------------- 1 | // 将多维数组展平为一位数组 2 | // 下面的代码参考了undercscore库的源代码http://www.css88.com/doc/underscore/docs/underscore.html 3 | function steamrollArray(arr) { 4 | var output=[],idx=0; 5 | for (var i = 0; i < arr.length; i++) {//遍历数组 6 | var item=arr[i]; 7 | if(Array.isArray(item)){//如果数组元素还是元素就递归 8 | item=steamrollArray(item); //递归过后的返回值还是数组 9 | var j=0,len=item.length; 10 | output.length+=len; 11 | while(j"']/g; 5 | // rules={"&":"&","<":"<",">":">",'"':""","'":"'"}; 6 | 7 | 8 | // return str.replace(pattern,function(match){ 9 | // return rules[match]; 10 | // }); 11 | // } 12 | // console.log(convertHTML("")); 13 | 14 | //方法二 15 | function convertHTML(str) { 16 | // :) 17 | var pattern=/[&<>"']/g; 18 | return str.replace(pattern,function(match){ 19 | switch(match){ 20 | case "<": 21 | return "<"; 22 | case ">": 23 | return ">"; 24 | case "&": 25 | return "&"; 26 | case "\"": 27 | return """; 28 | case "\'": 29 | return "'"; 30 | } 31 | }); 32 | } 33 | console.log(convertHTML("")); 34 | -------------------------------------------------------------------------------- /高级算法/5-No repeats please.js: -------------------------------------------------------------------------------- 1 | //同一个字母不相邻的排列组合 2 | /*2016-6-23 By沐浴星光*/ 3 | /*先组合出所有的情况,再使用正则表达式过滤掉不符合的情况*/ 4 | 5 | function permAlone(str) { 6 | 7 | 8 | var regex = /(.)\1+/g; 9 | 10 | var permutate=function(str) { 11 | 12 | var result=[]; 13 | if(str.length==1){ 14 | return [str]; 15 | }else{ 16 | 17 | var preResult=permutate(str.slice(1)); 18 | for (var j = 0; j < preResult.length; j++) { 19 | for (var k = 0; k < preResult[j].length+1; k++) { 20 | var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k); 21 | result.push(temp); 22 | 23 | } 24 | } 25 | 26 | return result; 27 | } 28 | }; 29 | 30 | var permutations= permutate(str); 31 | 32 | 33 | var filtered = permutations.filter(function(string) { 34 | return !string.match(regex); 35 | }); 36 | 37 | 38 | return filtered.length; 39 | } 40 | 41 | console.log(permAlone('aab')); -------------------------------------------------------------------------------- /附件/二分查找.js: -------------------------------------------------------------------------------- 1 | //二分查找 2 | 3 | 4 | //快速排序 5 | var quickSort=function(arr){ 6 | if(arr.length<=1){ 7 | return arr; 8 | } 9 | var pivotIndex=Math.floor((arr.length/2)); 10 | var pivot=arr.splice(pivotIndex,1)[0]; 11 | var left=[],right=[]; 12 | for (var i = 0; i < arr.length; i++) { 13 | if(arr[i]item) { 33 | high=mid-1; 34 | }else{ 35 | return mid; 36 | } 37 | } 38 | return -1;//没有找到就返回-1 39 | }; 40 | var arr=[85,24,63,45,17,31,96,50,23]; 41 | console.log(binarySearch(arr,45)); 42 | -------------------------------------------------------------------------------- /高级算法/4-Inventory Update.js: -------------------------------------------------------------------------------- 1 | //管理库存 2 | /*2016-6-23 By沐浴星光*/ 3 | function updateInventory(arr1, arr2) { 4 | 5 | var remain=[]; 6 | for (var i = 0; i < arr2.length; i++) { 7 | for (var j = 0; j < arr1.length; j++) { 8 | if (arr1[j][1]==arr2[i][1]) {//如果在arr1找到了相同项目,则直接增加数量 9 | arr1[j][0]+=arr2[i][0]; 10 | break; 11 | } 12 | } 13 | if (j==arr1.length) {//如果j的值最终等于arr1的长度,说明内部循环并没有找到该项目 14 | remain.push(arr2[i]);//将新增的项目暂时存在remain数组中; 15 | } 16 | } 17 | 18 | if (remain.length===0) {//如果没有新增项目 19 | return arr1; 20 | }else{ 21 | arr1=arr1.concat(remain);//合并重排序 22 | arr1.sort(function(var1,var2){ 23 | if(var1[1]>var2[1]){ 24 | return 1; 25 | }else if (var1[1]1) { 34 | index=partition(arr,left,right);//返回枢轴所在位置 35 | if (leftpivot){ 51 | j--; 52 | } 53 | if(i<=j){ 54 | swapQuickSort(arr,i,j); 55 | i++;j--; 56 | } 57 | } 58 | return i; 59 | } 60 | 61 | var swapQuickSort=function(array,index1,index2){ 62 | var temp=array[index1]; 63 | array[index1]=array[index2]; 64 | array[index2]=temp; 65 | }; 66 | -------------------------------------------------------------------------------- /高级算法/3-Exact Change.js: -------------------------------------------------------------------------------- 1 | //收银机找零(浮点数运算存在误差) 2 | /*2016-6-23 By沐浴星光*/ 3 | function checkCashRegister(price, cash, cid) { 4 | var diff=cash-price;//找零的金额 5 | var change=[];//找零方案数组 6 | var sum=0; 7 | var currency=[["PENNY", 0.01], ["NICKEL", 0.05], ["DIME", 0.10], ["QUARTER", 0.25], 8 | ["ONE", 1.00], ["FIVE", 5.00], ["TEN", 10.00], ["TWENTY", 20.00], ["ONE HUNDRED", 100.00]]; 9 | 10 | for (var i = currency.length-1; i>=0; i--) { 11 | var count=parseInt(diff/currency[i][1],10);//从最大额货币开始除 12 | if (count>0) { 13 | currency[i][1]=count*currency[i][1];//需要某个金额的货币的总数 14 | if (currency[i][1]<=cid[i][1]) {//如果需要的货币总额小于收银台余额 15 | 16 | cid[i][1]=cid[i][1]-currency[i][1];//收银台余额扣除相应的部分 17 | currency[i][1]=parseFloat(currency[i][1].toFixed(2));//注意结果要求保留两位小数 18 | change.push(currency[i]);//将这种某种货币的找零方式推入数组 19 | diff=(diff-currency[i][1]).toFixed(2);//剩余还要找给顾客的钱 20 | } 21 | if(currency[i][1]>cid[i][1]&&cid[i][1]>0){//如果需要的货币总额小于收银台余额 22 | 23 | currency[i][1]=parseFloat(cid[i][1].toFixed(2));//此时将这种货币的所有余额都用来找零 24 | change.push(currency[i]); 25 | diff=(diff-cid[i][1]).toFixed(2); 26 | cid[i][1]=0.00; 27 | } 28 | } 29 | } 30 | 31 | for (var j = 0; j < cid.length; j++) { 32 | sum+=cid[j][1];//统计收银台余额 33 | } 34 | 35 | if (change.length===0 ||diff>0) {//如果未形成找零方案或者还有钱没有找给顾客 36 | return "Insufficient Funds"; 37 | }else if (sum===0) { 38 | return "Closed"; 39 | }else{ 40 | return change; 41 | } 42 | } 43 | 44 | 45 | checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], 46 | ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]); -------------------------------------------------------------------------------- /附件/全排列.js: -------------------------------------------------------------------------------- 1 | 2 | //求给定数组元素的全排列 3 | // function permutate(arr) { 4 | 5 | // var result=[]; 6 | // if(arr.length==1){ 7 | // return [arr] 8 | // }else{ 9 | 10 | // var preResult=permutate(arr.slice(1)); 11 | // for (var j = 0; j < preResult.length; j++) { 12 | // for (var k = 0; k < preResult[j].length+1; k++) { 13 | // var temp=preResult[j].slice(); 14 | // temp.splice(k,0,arr[0]); 15 | // result.push(temp); 16 | // } 17 | // } 18 | 19 | // return result; 20 | 21 | // } 22 | // } 23 | 24 | // console.log(permutate(['a','b','c'])); 25 | 26 | 27 | //求给定字符串字符的全排列 28 | function permutate(str) { 29 | 30 | var result=[]; 31 | if(str.length==1){ 32 | return [str] 33 | }else{ 34 | var preResult=permutate(str.slice(1)); 35 | console.log(preResult); 36 | for (var j = 0; j < preResult.length; j++) { 37 | for (var k = 0; k < preResult[j].length+1; k++) { 38 | var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k); 39 | result.push(temp); 40 | } 41 | } 42 | return result; 43 | 44 | } 45 | } 46 | 47 | console.log(permutate("abc")); 48 | 49 | 50 | //求给定数组元素的全排列 51 | function permutate(input) { 52 | var permArr = [], 53 | usedChars = []; 54 | function main(input){ 55 | var i, ch; 56 | for (i = 0; i < input.length; i++) { 57 | ch = input.splice(i, 1)[0]; 58 | usedChars.push(ch); 59 | if (input.length == 0) { 60 | permArr.push(usedChars.slice()); 61 | } 62 | main(input); 63 | input.splice(i, 0, ch); 64 | usedChars.pop(); 65 | } 66 | return permArr 67 | } 68 | return main(input); 69 | }; 70 | console.log(permutate(['a','b','c'])); -------------------------------------------------------------------------------- /中级算法/3-Roman Numeral Converter.js: -------------------------------------------------------------------------------- 1 | //转换成罗马数字 2 | /*方法一*/ 3 | function convertToRoman1(num) { 4 | var symbols=['I','V','X','L','C','D','M']; 5 | var roman=""; 6 | var index=0; 7 | while(num>0){ 8 | var temp=num%10; 9 | switch(temp){//注意后面case取值的顺序很巧妙,并且注意哪些该加break,哪些不该加 10 | case 3: 11 | { 12 | roman+=symbols[index]; 13 | temp--; 14 | } 15 | case 2: 16 | { 17 | roman+=symbols[index]; 18 | temp--; 19 | } 20 | case 1: 21 | { 22 | roman+=symbols[index]; 23 | temp--; 24 | break; 25 | } 26 | case 4: 27 | { 28 | roman+=symbols[index+1]; 29 | roman+=symbols[index]; 30 | break; 31 | } 32 | case 8: 33 | { 34 | roman+=symbols[index]; 35 | temp--; 36 | } 37 | case 7: 38 | { 39 | roman+=symbols[index]; 40 | temp--; 41 | } 42 | case 6: 43 | { 44 | roman+=symbols[index]; 45 | temp--; 46 | } 47 | case 5: 48 | { 49 | roman+=symbols[index+1]; 50 | break; 51 | } 52 | case 9: 53 | { 54 | roman+=symbols[index+2]; 55 | roman+=symbols[index]; 56 | break; 57 | } 58 | default: 59 | { 60 | break; 61 | } 62 | 63 | } 64 | index+=2; 65 | num=Math.floor(num/10); 66 | } 67 | return roman.split("").reverse().join(""); 68 | } 69 | 70 | /*方法二*/ 71 | function convertToRoman2(num) { 72 | var symbols=[["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"], 73 | [ "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"], 74 | ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"], 75 | ["", "M", "MM", "MMM", "", "", "", "", "", "", ""]]; 76 | var roman=symbols[3][Math.floor(num/1000)] 77 | +symbols[2][Math.floor(num%1000/100)] 78 | +symbols[1][Math.floor(num%100/10)] 79 | +symbols[0][Math.floor(num%10)]; 80 | return roman; 81 | } 82 | 83 | 84 | convertToRoman1(36); -------------------------------------------------------------------------------- /高级算法/6-Friendly Date Ranges.js: -------------------------------------------------------------------------------- 1 | //日期格式化成风格友好格式 2 | ///*2016-6-23 By沐浴星光*/ 3 | function makeFriendlyDates(arr) { 4 | var result=[]; 5 | var Months=['January','February','March','April','May','June','July','August','September','October','November','December']; 6 | var Days=['1st','2nd','3rd','4th','5th','6th','7th','8th','9th', 7 | '10th','11th','12th','13th','14th','15th','16th','17th','18th','19th', 8 | '20th','21st','22nd','23rd','24th','25th','26th','27th','28th','29th','30th', 9 | '31st']; 10 | var start=arr[0].split("-"); 11 | var end=arr[1].split("-"); 12 | var startYear=parseInt(start[0],10), startMonth=parseInt(start[1],10),startDay=parseInt(start[2],10); 13 | var endYear=parseInt(end[0],10), endMonth=parseInt(end[1],10),endDay=parseInt(end[2],10); 14 | var diffYear=endYear-startYear; 15 | var friendlyStart='',friendlyEnd=''; 16 | var currentYear=new Date().getFullYear(); 17 | if ((diffYear==1&&startMonth1) { 18 | //如果起止时间超过一年,所有的信息都要显示 19 | friendlyStart=Months[startMonth-1]+" "+Days[startDay-1]+", "+startYear; 20 | friendlyEnd=Months[endMonth-1]+" "+Days[endDay-1]+', '+endYear; 21 | }else{//如果时间没超过一年 22 | 23 | friendlyStart=Months[startMonth-1]+" "+Days[startDay-1]; 24 | if (startYear!=currentYear) {//如果起始时间不是今年 25 | friendlyStart=friendlyStart+", "+startYear; 26 | } 27 | if (startYear==endYear&&startMonth==endMonth) {//如果起止年份和月份相同 28 | if (startDay!=endDay) {//如果起止日期不是同一天 29 | friendlyEnd=Days[endDay-1]; 30 | } 31 | }else{//如果起止月份不同 32 | friendlyEnd=Months[endMonth-1]+" "+Days[endDay-1]; 33 | } 34 | } 35 | result.push(friendlyStart); 36 | if (friendlyEnd!=='') { 37 | result.push(friendlyEnd); 38 | } 39 | return result; 40 | } 41 | 42 | console.log(makeFriendlyDates(["2022-09-05", "2023-09-04"])); --------------------------------------------------------------------------------