freeCodeCamp 旅途9 - 算法中级

算法中级:范围内的数字求和

function sumAll(arr) {
  let max = Math.max(...arr);
  let min = Math.min(...arr);
  let temp = 0
  for(let i=min; i<=max; i++){
    temp += i;
  }
  // temp = (min + max)*(max - min + 1)/2
  return temp;
}
sumAll([1, 4]);

算法中级:区分两个数组

function diffArray(arr1, arr2) {
  let newArr = [];
  function diff(a,b){
    a.forEach(x => {
      if(b.indexOf(x) === -1){
        newArr.push(x);
      }
    })
  }
  diff(arr1,arr2);
  diff(arr2, arr1);
  return newArr;
  // return arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x)));
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

算法中级:瞄准和消灭

function destroyer(arr) {
  let args = Array.from(arguments).slice(1);
  return arr.filter(x => !args.includes(x));
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);;

算法中级:罗密欧与朱丽叶

function whatIsInAName(collection, source) {
  let srcKeys = Object.keys(source);
  return collection.filter(obj => {
    return srcKeys.every(key => {
      return obj.hasOwnProperty(key) && obj[key] === source[key];
    })
  });
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

算法中级:短线连接格式

function spinalCase(str) {
  return str.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase().split(/(?:_| )+/g).join("-");
}
spinalCase('This Is Spinal Tap');

算法中级:儿童黑话

function translatePigLatin(str) {
  let regex = /[aeiou]/gi;
  if(str[0].match(regex)){
    return str + "way"
  }else if(str.match(regex) === null){
    return str + "ay"
  }else {
    let index = str.indexOf(str.match(regex)[0]);
    return str.slice(index) + str.slice(0,index)+"ay";
  }
}
// 或者
function translatePigLatin(str) {
  let newArr = [];
  let tempChar;
  function isConsonant(char){
    return !(/[aeiou]/).test(char);
  }
  if(!isConsonant(str.charAt(0))){
    return str + "way";
  }else {
    newArr = str.split("");
    while(isConsonant(newArr[0])){
      tempChar = newArr.shift();
      newArr.push(tempChar);
    }
    return newArr.join("")+"ay";
  }
}

translatePigLatin("consonant");

算法中级:搜索和替换

function myReplace(str, before, after) {
  after = /[A-Z]/.test(before[0])?after[0].toUpperCase()+after.slice(1):after;
  return str.replace(before, after);
}
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

算法中级:DNA 配对

function pairElement(str) {
  let pairs = {
      "A": "T",
      "T": "A",
      "C": "G",
      "G": "C"
    }
  return str.split("").map(x =>  [x, pairs[x]]);
}
pairElement("GCG");

算法中级:丢失的字母

function fearNotLetter(str) {
  for(let i=1;i<str.length;i++){
    if(str.charCodeAt(i) - str.charCodeAt(i-1) > 1){
      return String.fromCharCode(str.charCodeAt(i - 1)+1);
    }
  }
}
fearNotLetter("abce");

算法中级:集合排序

function uniteUnique(arr) {
  let concatArr = [];
  let i = 0;
  while(arguments[i]){
    concatArr = concatArr.concat(arguments[i]);
    i++;
  }
  return concatArr.filter((item,index) => {
    return concatArr.indexOf(item) === index;
  })
}
uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);

算法中级:转换HTML实体

function convertHTML(str) {
  // &colon;&rpar;
  let rule = {
    "&": "&amp;",
    "<": "&lt;",
    ">": "&gt;",
    "\"": "&quot;",
    "\'": "&apos;"
  }
  return str.split("").map(x => {
    return rule.hasOwnProperty(x)?rule[x]:x;
  }).join("");
  // return str.split("").map(x => rule[x] || x).join("");
}
convertHTML("Dolce & Gabbana");

算法中级:求斐波那契数组中的奇数之和

function sumFibs(num) {
  let preNumber = 0;
  let currNumber = 1;
  let result = 0;
  while(currNumber<=num){
    if(currNumber%2 !== 0){
      result += currNumber;
    }
    currNumber += preNumber;
    preNumber = currNumber - preNumber;
  }
  return result;
}
function sumFibs(num) {
  if (num < 0) return -1;
  if (num === 0 || num === 1) return 1;
  const arrFib = [1, 1];
  let nextFib = 0;
  while((nextFib = arrFib[0] + arrFib[1]) <= num) {
      arrFib.unshift(nextFib);
  }
  return arrFib.reduce((acc, curr) => {
      return acc + curr * (curr % 2);
  },0);
}
sumFibs(4);

算法中级:对所有素数求和

function sumPrimes(num) {
  let result = 0;
  function isPrimes(a){
    for(let i=2; i < a;i++){
      if(a%i===0&&a!==i){
        return false
      }
    }
    return true;
  }
  if (num <= 1){
    return 0;
  }
  for(let j=2;j<=num;j++){
    if(isPrimes(j)){
      result += j;
    }
  }
  return result;
}
sumPrimes(10);

算法中级:最小公倍数

function gcd(a, b) {
  while (b > 0) {
    let tmp = a;
    a = b;
    b = tmp % b;
  }
  return a;
}
function lcm(a, b) {
  return (a * b / gcd(a, b));
}
function smallestCommons(arr) {
  let min = Math.min.apply(null, arr);
  let max = Math.max.apply(null, arr);
  let smallestCommon = lcm(min, min + 1);
  while(min < max) {
    min++;
    smallestCommon = lcm(smallestCommon, min);
  }
  return smallestCommon;
}
smallestCommons([1,5]);

算法中级:放弃

function dropElements(arr, func) {
  // 删掉那些该舍弃的元素
  while(arr.length > 0 && !func(arr[0])) {
    arr.shift();
  }
  return arr;
}
dropElements([1, 2, 3], function(n) {return n < 3; });

算法中级:扁平化

function steamrollArray(arr) {
  let flattenedArray = [];
  var flatten = function(arg) {
    if (!Array.isArray(arg)) {
      flattenedArray.push(arg);
    } else {
      for (var a in arg) {
        flatten(arg[a]);
      }
    }
  };
  arr.forEach(flatten);
  return flattenedArray;
  // let flat = [].concat(...arr);
  // return flat.some(Array.isArray) ? steamrollArray(flat) : flat;
}
steamrollArray([1, [2], [3, [[4]]]]);

算法中级:二进制转化

function binaryAgent(str) {
  let biString = str.split(' ');
  let uniString = [];
  for(let i=0;i < biString.length;i++){
    uniString.push(String.fromCharCode(parseInt(biString[i], 2)));
  }
  return uniString.join('');
}
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");

算法中级:真假值判断

function truthCheck(collection, pre) {
  let counter = 0;
  for (let c in collection) {
    if (collection[c].hasOwnProperty(pre) && Boolean(collection[c][pre])) {
      counter++;
    }
  }
  return counter == collection.length;
  // return collection.every(function (element) {
    return element.hasOwnProperty(pre) && Boolean(element[pre]);
  });
}
truthCheck([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex");

算法中级:可选参数

function addTogether() {
  let args = Array.from(arguments);
  return args.some(n => typeof n !== 'number') ?
                undefined :
                args.length > 1 ?
                args.reduce((acc, n) => acc += n, 0) :
                (n) => typeof n === "number" ?
                n + args[0] :
                undefined;
        }
  addTogether(2, 3);

算法中级:构造一个 Person 类

var Person = function(firstAndLast) {
  var fullName = firstAndLast;
  this.getFirstName = function() {
    return fullName.split(" ")[0];
  };
  this.getLastName = function() {
    return fullName.split(" ")[1];
  };
  this.getFullName = function() {
    return fullName;
  };
  this.setFirstName = function(name) {
    fullName = name + " " + fullName.split(" ")[1];
  };
  this.setLastName = function(name) {
    fullName = fullName.split(" ")[0] + " " + name;
  };
  this.setFullName = function(name) {
    fullName = name;
  };
};
var bob = new Person('Bob Ross');
bob.getFullName();

算法中级:绘制碎片图

function orbitalPeriod(arr) {
  var GM = 398600.4418;
  var earthRadius = 6367.4447;
  for(var prop in arr) {
    var orbitalPer = Math.round(2 * Math.PI * Math.sqrt(Math.pow(arr[prop].avgAlt + earthRadius, 3) / GM));
    delete arr[prop].avgAlt;
    arr[prop].orbitalPeriod = orbitalPer;
  }
  return arr;
}
orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,606评论 6 533
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,582评论 3 418
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,540评论 0 376
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,028评论 1 314
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,801评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,223评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,294评论 3 442
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,442评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,976评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,800评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,996评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,543评论 5 360
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,233评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,662评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,926评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,702评论 3 392
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,991评论 2 374

推荐阅读更多精彩内容