1. 程式人生 > >FCC中級算法

FCC中級算法

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

FCC中級算法