FreeCodeCamp 中级算法(个人向)
freecodecamp 中級算法地址戳這里
Sum All Numbers in a Range
我們會傳遞給你一個包含兩個數字的數組。返回這兩個數字和它們之間所有數字的和。
1 function sumAll(arr) { 2 arr.sort(function(a,b){ 3 return a-b; 4 }); 5 var a=arr[0]; 6 var sum=arr[0]; 7 while( a<arr[1] ){ 8 a++; 9 sum+=a; 10 } 11 return sum; 12 } 13 14 sumAll([1, 4]);Diff Two Arrays
比較兩個數組,然后返回一個新數組,該數組的元素為兩個給定數組中所有獨有的數組元素。換言之,返回兩個數組的差異。
1 function diff(arr1, arr2) { 2 var newArr = []; 3 // Same, same; but different. 4 var len,long,short; 5 if( arr1.length<=arr2.length ){ 6 len=arr1.length; 7 short=arr1; 8 long=arr2; 9 }else{ 10 len=arr2.length; 11 short=arr2; 12 long=arr1; 13 } 14 15 for(var i=0;i<len;i++){ 16 var index=long.indexOf( short[i] ); 17 if( index==-1 ){ 18 newArr.push( short[i] ); 19 }else{ 20 long.splice(index,1); 21 } 22 } 23 newArr=newArr.concat(long); 24 return newArr; 25 } 26 27 diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);Roman Numeral Converter
將給定的數字轉換成羅馬數字
var convert=(function() {//1 5 10 50 100 500 1000//I V X L C D Mvar arr=[["I","V"],["X","L"],["C","D"],["M"]]; //檢索的數組緩存起來return function(num){var str="";var num_arr=String(num).split("");for(var i=0,l=num_arr.length;i<l;i++){ //對每一位的數字進行處理var x=parseInt( num_arr[i] );str+=handle(arr[l-1-i],arr[l-i],x); //傳參 }return str;};})();function handle(arr,big_arr,x){ //這里是對輸入的x數字進行處理,arr和big_arr根據傳參確定,這里對應的是羅馬數字規則var res="";if( x==0 ){return res;}if( x<=3 ){for(var i=0;i<x;i++){res+=arr[0];} }else if( x==4 ){res=arr[0]+arr[1];}else if( x==9 ){res=arr[0]+big_arr[0];}else{ //大于等于5但是小于9的var cha=x-5;res=arr[1];for(var i=0;i<cha;i++){res+=arr[0];}}return res; }convert(36);Where art thou
寫一個 function,它遍歷一個對象數組(第一個參數)并返回一個包含相匹配的屬性-值對(第二個參數)的所有對象的數組。如果返回的數組中包含 source 對象的屬性-值對,那么此對象的每一個屬性-值對都必須存在于 collection 的對象中。
function where(collection, source) {var arr = [];var target=Object.keys(source); //數組outer:for(var i in collection){for(var j in target){if( collection[i].hasOwnProperty(target[j])===false || collection[i][target[j]]!=source[target[j]] ){continue outer;}}arr.push(collection[i]);}// What's in a name?return arr; }where([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });Search and Replace
使用給定的參數對句子執行一次查找和替換,然后返回新句子。
function myReplace(str, before, after) { //查找替換var arr=str.split(" ");var index=arr.indexOf(before);arr.splice(index,1,change(before,after));return arr.join(" "); }function change(before,after){ //保證單詞大小寫不變var isLower=judge(before); //小寫返回truevar change_arr=after.split("");change_arr[0]=isLower?change_arr[0].toLowerCase():change_arr[0].toUpperCase();return change_arr.join(""); }function judge(str){if( str.substr(0,1).toLowerCase()==str.substr(0,1) ){ //判斷首字母大小寫return true;}else{return false;} }myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");Pig Latin
把指定的字符串翻譯成 pig latin
常規解法:
function translate(str) { //主體函數var num=getnum(str); //搜索結果if ( num==-1 ){return "沒有元音";}else if( num==0 ){return str+"way";}else{return str.substring(num,str.length)+str.substring(0,num)+"ay";} }function getnum(str){ //搜索str中是否有元音字母return search(str,"a","e","i","o","u"); };function search(){ //搜索是否含有一些字符,有就返回序號,否則返回-1var str=[].shift.apply(arguments);var n;var flag=true;for(var i=0,l=arguments.length;i<l;i++){var nth=str.indexOf(arguments[i]);if( nth>-1 ){n=(n==undefined)?nth:(n<nth?n:nth); flag=false;}}return flag?-1:n; };translate("consonant");
正則解法:
function translate(str){var str2=str.replace(/[aeiou]/g,"|");var index=str2.indexOf("|");if ( index==-1 ){return "沒有元音";}else if( index==0 ){return str+"way";}else{return str.substring(index,str.length)+str.substring(0,index)+"ay";} }translate("consonant");DNA Pairing
DNA 鏈缺少配對的堿基。依據每一個堿基,為其找到配對的堿基,然后將結果作為第二個數組返回。
function pair(str) {var arr=[["A","T"],["C","G"]];var result=[];var str_arr=str.split("");for(var i in str_arr){for(var j in arr){var index=arr[j].indexOf( str_arr[i] );if( index!=-1 ){result.push( [str_arr[i],arr[j][1-index]] );}} }return result; }pair("GCG");Missing letters
從傳遞進來的字母序列中找到缺失的字母并返回它。
function fearNotLetter(str) {var len=str.length;var before,after;var res="";if( str.charCodeAt(len-1)-str.charCodeAt(0)+1==len ){ //首尾相差的數量正確,返回undefinedreturn undefined;}for(var i=0;i<len;i++){ //遍歷字符串的序號before=str.charCodeAt(i);after=str.charCodeAt(i+1);if( after-before>1 ){ //發現相鄰不連續do{res+=String.fromCharCode(before+1);before++;}while( after-before>1 );return res;}} }fearNotLetter("abce");Boo who
檢查一個值是否是基本布爾類型,并返回 true 或 false。
function boo(bool) {// What is the new fad diet for ghost developers? The Boolean.if( typeof(bool)==="boolean" ){return true; }else{return false; } }boo(null);Sorted Union
寫一個 function,傳入兩個或兩個以上的數組,返回一個以給定的原始數組排序的不包含重復值的新數組。
function unite() {var arr=[];for(let i in arguments){arr.push( arguments[i] );}var res=arr.reduce(function(a,b){for(var i=0,l=a.length;i<l;i++){var index=b.indexOf(a[i]);if( index!=-1 ){b.splice(index,1); }}return a.concat(b);});return res; }unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);Convert HTML Entities
將字符串中的字符 &、<、>、" (雙引號), 以及 ' (單引號)轉換為它們對應的 HTML 實體。
function convert(str) {// :)var list={"&":"&","<":"<",">":">","\"":""","\'":"'" };for(var key in list){str=str.replace(new RegExp(key,"g"),list[key]);}return str; }convert("Dolce & Gabbana");Spinal Tap Case
將字符串轉換為 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 這種形式的,也就是以連字符連接所有小寫單詞
function spinalCase(str) {// "It's such a fine line between stupid, and clever."// --David St. Hubbinsstr=str.replace(/_/g," ");var arr=str.split(" ");if( arr.length==1 ){str=str.replace(/([A-Z])/g," $1");}str=str.trim().toLowerCase().replace(/[\s]/g,"-");return str; }spinalCase('thisIsSpinalTap');個人方法感覺很多地方啰嗦了點,可以進一步改進。
Sum All Odd Fibonacci Numbers
給一個正整數num,返回小于或等于num的斐波納契奇數之和。
function sumFibs(num) {var arr=get(num); //獲取數列var res=arr.filter(function(a){ //篩選出奇數return a%2!==0;}).reduce(function(a,b){ //返回奇數之和return a+b;});return res; }function get(num){ //返回一個斐波納契數列,最后一位小于等于numvar arr=[1];var sum=1;var before=0;var after=1;while( sum<=num ){arr.push(sum);before=after;after=sum;sum=before+after;}return arr; }sumFibs(4);
Sum All Primes
求小于等于給定數值的質數之和。
function sumPrimes(num) {var res=getarr(num).reduce(function(a,b){ return a+b;});return res; }function getarr(num){ //返回質數數組var arr=[];outer:for(var i=2;i<=num;i++){for(var j=2;j<i;j++){if( i%j===0 ){continue outer;}}arr.push(i);}return arr; }sumPrimes(10);Smallest Common Multiple?
找出能被兩個給定參數和它們之間的連續數字整除的最小公倍數。
function smallestCommons(arr) {var res=make_arr(arr).reduce(function(a,b){ //利用reduce,兩兩求最小公倍數return gcd(a,b);});return res; }function make_arr(arr){ //返回包含給定參數和他們之間連續數字的順序數組arr.sort(function(a,b){return a-b;});var max=arr.pop();var num=arr[0];while( num<max ){num++;arr.push(num);}return arr;}function gcd(a,b){ //遍歷,獲得a,b的最小公倍數var max=Math.max(a,b),min=Math.min(a,b),count;for(var i=1;i<=max;i++){count=min*i;if(count%max===0){return count;}}}smallestCommons([1,5]);Finders Keepers
寫一個 function,它瀏覽數組(第一個參數)并返回數組中第一個通過某種方法(第二個參數)驗證的元素。
function find(arr, func) { return arr.filter(func)[0]; }find([1, 2, 3, 4], function(num){ return num % 2 === 0; });Drop it
讓我們來丟棄數組(arr)的元素,從左邊開始,直到回調函數return true就停止。
function drop(arr, func) {// Drop them elements.var top=0;for(var l=arr.length;top<l;top++){if( func(arr[top]) ){break;}}return arr.slice(top); }drop([1, 2, 3, 4], function(n) {return n >= 3;});Steamroller
對嵌套的數組進行扁平化處理。你必須考慮到不同層級的嵌套。
function steamroller(arr) {// I'm a steamroller, babywhile (arr.some(item => item instanceof Array)) {arr = [].concat(...arr);}return arr; }steamroller([1, [2], [3, [[4]]]]);Binary Agents
傳入二進制字符串,翻譯成英語句子并返回。
function binaryAgent(str) {var arr=str.split(" ");for(var i in arr){arr[i]=String.fromCharCode( parseInt(arr[i],2) );}var res=arr.join("");return res; }binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");Everything Be True
完善編輯器中的every函數,如果集合(collection)中的所有對象都存在對應的屬性(pre),并且屬性(pre)對應的值為真。函數返回ture。反之,返回false。
function every(collection, pre) {// Is everyone being true?var res=collection.every(function(item){return item[pre];});return res; }every([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");Arguments Optional
創建一個計算兩個參數之和的 function。如果只有一個參數,則返回一個 function,該 function 請求一個參數然后返回求和的結果。
function add() {var arr=[].concat(...arguments);if( arr.some(function(ele){return typeof ele!="number";}) ){ //參數出現非數字類型,返回undefinedreturn undefined;}if( arr.length==2 ){return arr[0]+arr[1];}return function(a){if( typeof a != "number" ){ //同上return undefined;}return a+arr[0];}; }add(2)(3);?
轉載于:https://www.cnblogs.com/grey-zhou/p/6134665.html
總結
以上是生活随笔為你收集整理的FreeCodeCamp 中级算法(个人向)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PE读写
- 下一篇: 10-03视图的优缺点及注意事项