FCC中级算法(上)

时间:2022-08-24 21:16:54

在学习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

将给定的数字转换成罗马数字。

FCC中级算法(上)

思路:根据对照表,建立两个对应的数组,通过待转换的数字不断的减去比自己小一级的数字,找到对应的罗马数字,进行字符串拼接。

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)]];
});
}