在学习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); var min=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;}); return newArray1.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)]]; }); }