FCC中級算法
阿新 • • 發佈:2019-04-25
tle 一次 數學 分享圖片 單個字符 所有 ase 比較 之間
在學習FCC中級算法這一塊,自己遇到了很多問題,通過RSA也慢慢把問題解決了,發現每一個問題都會有很多的解決思路,因此把自己想到的一些思路記錄到這裏。
1. Sum All Numbers in a Range
我們會傳遞給你一個包含兩個數字的數組。返回這兩個數字和它們之間所有數字的和。
思路1:定位最大和最小的值,進行累和相加,用到函數:Math.max(),Math.min(),Function.apply()
function sumAll(arr) { var sum=0; var max=Math.max.apply(null,arr); varmin=Math.min.apply(null,arr); for(var i=min;i<=max;i++){ sum += i; } return sum; }
思路2:使用數學的等差公式進行計算。
Sn = n * (a1 + an) / 2 //等差公式
function sumAll(arr) { return (arr[0] + arr[1]) * (Math.abs(arr[1] - arr[0]) + 1) / 2; }
2. Diff Two Arrays
比較兩個數組,然後返回一個新數組,該數組的元素為兩個給定數組中所有獨有的數組元素。
思路1:過濾掉兩個數組不符合要求的元素,合並兩個新的元素。用到函數:Array.filter(),Array.concat(),Array.indexOf()
function diff(arr1,arr2){ var newArray1=arr1.filter(function(val){ return arr2.indexOf(val)===-1;}); var newArray2=arr2.filter(function(val){ return arr1.indexOf(val)===-1;}); returnnewArray1.concat(newArray2); }
思路2:用循環找到符合的元素,將所有滿足的元素放入新的數組中。用到函數:Array.indexOf(),Array.push()
function diff(arr1, arr2) { var newArr = []; for(var i=0;i<arr1.length;i++){ if(arr2.indexOf(arr1[i])==-1){ newArr.push(arr1[i]); } } for(var j=0;j<arr2.length;j++){ if(arr1.indexOf(arr2[j])==-1){ newArr.push(arr2[j]); } } // Same, same; but different. return newArr; }
3. Roman Numberal Converter
將給定的數字轉換成羅馬數字。
思路:根據對照表,建立兩個對應的數組,通過待轉換的數字不斷的減去比自己小一級的數字,找到對應的羅馬數字,進行字符串拼接。
function convert(num) { const numArr=[1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]; const romArr=[‘I‘, ‘IV‘, ‘V‘, ‘IX‘, ‘X‘, ‘XL‘, ‘L‘, ‘XC‘, ‘C‘, ‘CD‘, ‘D‘, ‘CM‘, ‘M‘]; var str=""; for(var i=numArr.length-1;i>=0;i--){ for(;num>=numArr[i];num-=numArr[i]){ str+=romArr[i]; } } return str; }
4. Where art thou
寫一個 function,它遍歷一個對象數組(第一個參數)並返回一個包含相匹配的屬性-值對(第二個參數)的所有對象的數組。
思路:獲取第二個參數的所有key,遍歷第一個參數中的所有對象,保留符合的對象。用到函數:Object.keys(),Object.hasOwnProperty(),Array.filter
function where(collection, source) { var arr=[]; var keys=Object.keys(source); arr=collection.filter(function(val){ for(var i in keys){ if(!val.hasOwnProperty(keys[i])||val[keys[i]]!==source[keys[i]]){ return false; } } return true; }); return arr; }
5.Search and Replace
使用給定的參數對句子執行一次查找和替換,然後返回新句子。
第一個參數是將要對其執行查找和替換的句子。
第二個參數是將被替換掉的單詞(替換前的單詞)。
第三個參數用於替換第二個參數(替換後的單詞)。
思路:先檢查被替換的單詞第一個字母是否大寫,如果是大寫,把用於替換的單詞首字母改成大寫,然後替換進原字符串中。用到函數:String.toUpperCase(),String.slice(),String.replace()
function myReplace(str, before, after) { if(before[0]==before[0].toUpperCase()){ after=after[0].toUpperCase()+after.slice(1); } str=str.replace(before,after); return str; }
6.Pig Latin
把指定的字符串翻譯成 pig latin。
Pig Latin 把一個英文單詞的第一個輔音或輔音叢(consonant cluster)移到詞尾,然後加上後綴 "ay"。
如果單詞以元音開始,你只需要在詞尾添加 "way" 就可以了。
思路1:先判斷第一個是否為元音,是的話直接返回目標字符串,否則遍歷字符串,首字母不斷後移,直到碰到元音字母,返回目標字符串。
function translate(str) { let astr="aeiou"; if(astr.indexOf(str[0])!=-1){ return str+"way"; }else{ for(let i in str){ if(astr.indexOf(str[0])==-1){ str=str.slice(1)+str[0]; }else{ return str+"ay"; } } } return str; }
思路2:找到第一原因字母的下標,判斷是否為第一個,返回對應的字符串。用到函數:Array.indexOf(),String.slice(),String.substr()
function translate(str) { let astr="aeiou"; let index=0; for(let i in str){ if(astr.indexOf(str[i])!=-1){ index=i; break; } } return index == 0 ? str + "way" : str.slice(index)+str.substr(0,index)+"ay"; }
7.DNA Pairing
DNA 鏈缺少配對的堿基。依據每一個堿基,為其找到配對的堿基,然後將結果作為第二個數組返回。
Base pairs(堿基對) 是一對 AT 和 CG,為給定的字母匹配缺失的堿基。
在每一個數組中將給定的字母作為第一個堿基返回。
思路:
堿基對一共只有4種情況,根據給出的堿基,返回對應的數組,追加到新數組中。
用到函數:String.split(),Array.push()
function pair(str) { let arr=[]; let newArr=[]; arr=str.split(""); for(let i in arr){ switch(arr[i]){ case "A":newArr.push([arr[i],"T"]); break; case "T":newArr.push([arr[i],"A"]); break; case "C":newArr.push([arr[i],"G"]); break; case "G":newArr.push([arr[i],"C"]); break; } } return newArr; }
思路2:
創建兩個數組,分別存儲[‘A‘, ‘T‘, ‘C‘, ‘G‘]和[‘T‘, ‘A‘, ‘G‘, ‘C‘],利用下標找到配對堿基。
用到函數:
split()
割字符串為單個字符數組
map()生成新的數組
function pair(str) { const arr1 = [‘A‘, ‘T‘, ‘C‘, ‘G‘]; const arr2 = [‘T‘, ‘A‘, ‘G‘, ‘C‘]; return str.split(‘‘).map((val)=>{ return [val, arr2[arr1.indexOf(val)]]; }); }
FCC中級算法