1. Sum All Numbers in a Range ```javascript // 解法1, 遍历求和 function sumAll(arr) { let res = 0; let max = Math.max(arr[0], arr[1]) let min = Math.min(arr[0], arr[1]) for(let i = min; i <= max; i++) { res += i } return res; }

    sumAll([1, 4]);

    // 解法2,高斯求和 function sumAll(arr) { return ((arr[0] + arr[1]) * (Math.abs(arr[1] - arr[0]) + 1 ))/ 2 }

    sumAll([1, 4]);

    1. 2. **Diff Two Arrays**
    2. ```javascript
    3. // 解法1
    4. function diffArray(arr1, arr2) {
    5. var newArr = [];
    6. for (let i = 0; i < arr1.length; i++) {
    7. if (!arr2.includes(arr1[i])) {
    8. newArr.push(arr1[i])
    9. }
    10. }
    11. for (let i = 0; i < arr2.length; i++) {
    12. if (!arr1.includes(arr2[i])) {
    13. newArr.push(arr2[i])
    14. }
    15. }
    16. return newArr;
    17. }
    18. diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
    19. // 解法2
    20. function diffArray(arr1, arr2) {
    21. return arr1.filter(e => !arr2.includes(e))
    22. .concat(arr2.filter(e => !arr1.includes(e)))
    23. }
    24. diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
    25. // 解法3
    26. function diffArray(arr1, arr2) {
    27. return arr1.concat(arr2).filter(
    28. e => !arr1.includes(e) || !arr2.includes(e)
    29. )
    30. }
    31. diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
    1. Seek and Destroy ```javascript // 解法1 function destroyer(arr) { arr = Array.from(arguments)
      let [source, …toDelete] = arr; let res = [] for (let i = 0; i < source.length; i++) { if (!toDelete.includes(source[i])) { res.push(source[i]) } } return res }

    destroyer([1, 2, 3, 1, 2, 3], 2, 3); // [1,1]

    function destroyer(arr) { arr = Array.from(arguments); let source = arr[0] let target = new Set(arr.slice(1)) return source.filter(e => !target.has(e)) }

    destroyer([1, 2, 3, 1, 2, 3], 2, 3); // [1,1]

    1. 4. **Wherefore art thou**
    2. ```javascript
    3. // 解法1
    4. function whatIsInAName(collection, source) {
    5. let res = [];
    6. // Only change code below this line
    7. for (let i = 0; i < collection.length; i++) {
    8. let shouldKeep = true;
    9. let current = collection[i]
    10. for (let key in source) {
    11. if (source[key] !== current[key]) {
    12. shouldKeep = false
    13. }
    14. }
    15. if (shouldKeep) {
    16. res.push(current)
    17. }
    18. }
    19. // Only change code above this line
    20. return res;
    21. }
    22. whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
    23. // 解法2
    24. function whatIsInAName(collection, source) {
    25. return collection.filter(current =>
    26. Object.keys(source).every(key => source[key] === current[key]))
    27. }
    28. whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
    29. // 解法三
    30. function whatIsInAName(collection, source) {
    31. return collection.filter(current =>
    32. Object.keys(source)
    33. .reduce((acc, cur) => acc && current[cur] === source[cur], true)
    34. )
    35. }
    36. whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });
    1. Spinal Tap Case ```javascript // 解法1 function spinalCase(str) { let res = ‘’ for (let i = 0; i < str.length; i++) { let current = str[i]

      if (/[A-Z]/.test(current)) { if (str[i-1] && /[a-z]/.test(str[i-1])) {

      1. res += '-'

      } }

      if (current === ‘ ‘ || current === ‘_’) { res += ‘-‘ } else { res += current.toLowerCase() } } return res; }

    spinalCase(‘This Is Spinal Tap’);

    // 解法2 function spinalCase(str) { return str.replace(/ |_/g, ‘-‘) .replace(/([a-z])([A-Z])/g, ‘$1-$2’) .toLowerCase() }

    spinalCase(‘This Is Spinal Tap’);

    // 解法3 function spinalCase(str) { return str .split(/\s|_|(?<=[a-z])\B(?=[A-Z])/) .join(‘-‘) .toLowerCase()

    }

    spinalCase(‘This Is Spinal Tap’);

    1. 6. **Pig Latin**
    2. ```javascript
    3. // 解法1
    4. function translatePigLatin(str) {
    5. let vowelIndex = -1
    6. for (let i = 0; i < str.length; i++) {
    7. if(/[aeiou]/.test(str[i])) {
    8. vowelIndex = i;
    9. break;
    10. }
    11. }
    12. if (vowelIndex === -1) {
    13. return str + 'ay'
    14. } else if (vowelIndex === 0) {
    15. return str + 'way'
    16. } else {
    17. return str.slice(vowelIndex) + str.slice(0, vowelIndex)
    18. + 'ay'
    19. }
    20. }
    21. translatePigLatin("consonant");
    22. // 解法2, 正则
    23. function translatePigLatin(str) {
    24. return str.replace(/([^aeiou]*)([aeiou]?)(\w*)/, (
    25. match, before, vowel, after
    26. ) => {
    27. if (before) {
    28. return vowel + after + before+ 'ay'
    29. } else {
    30. return vowel + after + 'way'
    31. }
    32. })
    33. }
    34. translatePigLatin("consonant");
    35. function translatePigLatin(str) {
    36. return str.replace(/([^aeiou]*)([aeiou]?)(\w*)/, (
    37. match, before, vowel, after
    38. ) => {
    39. return `${vowel}${after}${before || 'w'}ay`
    40. })
    41. }
    42. translatePigLatin("consonant");
    43. function translatePigLatin(str) {
    44. return str.replace(/([^aeiou]*)(\w*)/, (
    45. match, before, after
    46. ) => {
    47. return `${after}${before || 'w'}ay`
    48. })
    49. }
    50. translatePigLatin("consonant");
    51. function translatePigLatin(str) {
    52. return str.replace(/(^[aeiou]\w+$)/, '$1way')
    53. .replace(/^([^aeiou]+)(\w*)$/, '$2$1ay')
    54. }
    55. translatePigLatin("consonant");
    1. Search and Replace ```javascript // 解法1 function myReplace(str, before, after) { if (/[A-Z]/.test(before[0])) { after = after[0].toUpperCase() + after.slice(1) } else { after = after[0].toLowerCase() + after.slice(1) } return str.replace(before, after) }

    myReplace(“A quick brown fox jumped over the lazy dog”, “jumped”, “leaped”);

    // 解法2 function myReplace(str, before, after) { let arr = str.split(‘ ‘) for (let i = 0; i < arr.length; i++) { if (arr[i] === before) { if (/^[A-Z]/.test(before)) { arr[i] = after[0].toUpperCase() + after.slice(1) } else { arr[i] = after[0].toLowerCase() + after.slice(1) } } }

    return arr.join(‘ ‘) }

    myReplace(“A quick brown fox jumped over the lazy dog”, “jumped”, “leaped”);

    function myReplace(str, before, after) { let arr = str.split(‘ ‘), target; if (/^[A-Z]/.test(before)) { target = after[0].toUpperCase() + after.slice(1) } else { target = after[0].toLowerCase() + after.slice(1) } for (let i = 0; i < arr.length; i++) { if (arr[i] === before) { arr[i] = target } }

    return arr.join(‘ ‘) }

    myReplace(“A quick brown fox jumped over the lazy dog”, “jumped”, “leaped”);

    // 解法3 function myReplace(str, before, after) { let arr = str.split(‘ ‘), target; if (/^[A-Z]/.test(before)) { target = after[0].toUpperCase() + after.slice(1) } else { target = after[0].toLowerCase() + after.slice(1) }

    return arr.reduce( (acc, cur) => ${acc} ${cur === before ? target : cur} ) }

    myReplace(“A quick brown fox jumped over the lazy dog”, “jumped”, “leaped”);

    1. 8. **DNA Pairing**
    2. ```javascript
    3. // 解法1
    4. function pairElement(str) {
    5. let res = []
    6. for (let i = 0; i < str.length; i++) {
    7. let curr = str[i]
    8. if (curr === 'A') {
    9. res.push(['A', 'T'])
    10. } else if(curr === 'T') {
    11. res.push(['T', 'A'])
    12. }else if(curr === 'C') {
    13. res.push(['C', 'G'])
    14. }else if(curr === 'G') {
    15. res.push(['G', 'C'])
    16. }
    17. }
    18. return res;
    19. }
    20. pairElement("GCG");
    21. // 解法2
    22. function pairElement(str) {
    23. let res = []
    24. let map = new Map([["A","T"],["T","A"],["C","G"],["G","C"]])
    25. for (let char of str) {
    26. res.push([char, map.get(char)])
    27. }
    28. return res;
    29. }
    30. pairElement("GCG");
    1. Missing letters ```javascript // 解法1 function fearNotLetter(str) { for (let i = 0; i < str.length - 1; i++) { let cur = str[i].charCodeAt() let next = str[i+1].charCodeAt() if (next !== cur + 1) { return String.fromCharCode(cur+1) } } }

    fearNotLetter(“abce”);

    // 解法2 function fearNotLetter(str) { let prev = str.charCodeAt(0); for (let i = 1; i < str.length; i++) { let cur = str[i].charCodeAt() if (cur !== prev + 1) { return String.fromCharCode(prev+1) } prev = cur } }

    fearNotLetter(“abce”);

    // 解法3 function fearNotLetter(str) { let start = str.charCodeAt(0) let end = str.charCodeAt(str.length - 1) return Array.from({length: end - start +1 }, (_, i) => String.fromCharCode(start+i)).filter(char => !str.includes(char))[0] }

    fearNotLetter(“abce”);

    1. 10. **Sorted Union**
    2. ```javascript
    3. // 解法1
    4. function uniteUnique(arr) {
    5. arr = [...arguments]
    6. let res = []
    7. for (let item of arr) {
    8. for (let subItem of item) {
    9. if (!res.includes(subItem)) {
    10. res.push(subItem)
    11. }
    12. }
    13. }
    14. return res;
    15. }
    16. uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
    17. // 解法2
    18. function uniteUnique(arr) {
    19. arr = [...arguments]
    20. return arr.reduce((acc, cur) => acc.concat(
    21. cur.filter(e => !acc.includes(e))
    22. ), [])
    23. }
    24. uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
    25. // 解法3
    26. function uniteUnique(arr) {
    27. arr = [...arguments]
    28. return arr.reduce((acc, cur) => acc.concat(cur))
    29. .filter((e, i, combined) => combined.indexOf(e) === i)
    30. }
    31. uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
    32. // 解法4
    33. function uniteUnique(arr) {
    34. return [...new Set([...arguments].flat())]
    35. }
    36. uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]);
    1. Convert HTML Entities ```javascript // 解法1 function convertHTML(str) { let entitiesMap = { ‘&’: ‘&’, ‘<’: ‘<’, ‘>’: ‘>’, ‘“‘: ‘"’, ‘\’’: ‘'’, } return str.replace(/[&<>”‘]/g, match => entitiesMap[match]) }

    convertHTML(“Dolce & Gabbana”);

    // 解法2 function convertHTML(str) { let entitiesMap = { ‘&’: ‘&’, ‘<’: ‘<’, ‘>’: ‘>’, ‘“‘: ‘"’, ‘\’’: ‘'’, } return str.split(‘’).reduce((acc, cur) => acc+= (entitiesMap[cur] || cur ) , ‘’) }

    convertHTML(“Dolce & Gabbana”);

    1. 14. **Binary Agents**
    2. ```javascript
    3. function binaryAgent(str) {
    4. let arr = str.split(' ')
    5. return arr.reduce((acc, cur) => acc += String.fromCharCode(parseInt(cur, 2))
    6. , '')
    7. }
    8. binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
    1. Everything Be True ```javascript function truthCheck(collection, pre) { for (let i = 0; i < collection.length; i++) { let cur = collection[i] if (!cur[pre]) return false; } return true; }

    truthCheck([{“user”: “Tinky-Winky”, “sex”: “male”}, {“user”: “Dipsy”, “sex”: “male”}, {“user”: “Laa-Laa”, “sex”: “female”}, {“user”: “Po”, “sex”: “female”}], “sex”);

    function truthCheck(collection, pre) { return collection.every(o => o[pre]) }

    1. 16. **Arguments Optional**
    2. ```javascript
    3. function addTogether() {
    4. let args = [...arguments]
    5. let isNumbers = (numbers) => numbers.every(num => typeof num === 'number')
    6. if (!isNumbers(args)) return;
    7. if (args.length === 2) {
    8. return args[0] + args[1]
    9. }
    10. return function () {
    11. if (!isNumbers([...arguments])) return
    12. return args[0] + arguments[0]
    13. }
    14. }
    15. addTogether(2,3);
    1. Sum All Odd Fibonacci Numbers ```javascript // 解法1: 转化成数组 function sumFibs(num) { let fibs = [1,1] while(true) { let len = fibs.length; let next = fibs[len -1] + fibs[len -2] if (next <= num) { fibs.push(next); } else { break; } } return fibs.reduce((acc, cur) => (cur % 2 === 1 ? acc+ cur: acc),0) }

    sumFibs(4);

    // 解法2 function sumFibs(num) { let thePrev = 1, prev = 1; let res = 2; while(thePrev + prev <= num) { let next = thePrev + prev; if (next % 2 === 1) { res += next } thePrev = prev; prev = next; } return res; }

    sumFibs(4);

    function sumFibs(num) { let prev = 1, cur = 1; let res = 1;

    while(cur <= num) { if (cur % 2 === 1) { res += cur; } cur += prev; prev = cur - prev; } return res; }

    sumFibs(4);

    // 解法3 function sumFibs(num) { return getSum(1,1,1, num); }

    function getSum(prev, cur, sum, num) { if (cur > num) { return sum } if (cur % 2 === 1) { sum += cur } // cur = prev + cur return getSum(cur, prev+cur, sum, num) }

    sumFibs(4);

    1. 18. **Smallest Common Multiple**
    2. ```javascript
    3. // 解法1;
    4. function smallestCommons(arr) {
    5. let smaller = Math.min(...arr)
    6. let larger = Math.max(...arr)
    7. let res = 1;
    8. for (let i = smaller; i <= larger; i++) {
    9. res = getSCM(i, res);
    10. }
    11. return res;
    12. }
    13. function getSCM(left, right) {
    14. if (left === 0 || right === 0) {
    15. return
    16. }
    17. if (left === right) {
    18. return right
    19. }
    20. let res = right
    21. while(res <= left * right) {
    22. if (res % left === 0) {
    23. return res
    24. }
    25. res += right
    26. }
    27. }
    28. smallestCommons([1,5]);
    29. // 解法2, 辗转相除法获取x,y最大公约数c,最小公倍数 m = x * y / c
    30. function smallestCommons(arr) {
    31. let smaller = Math.min(...arr)
    32. let larger = Math.max(...arr)
    33. let res = 1;
    34. while(smaller <= larger) {
    35. res = smaller * res / getGCD(smaller, res)
    36. smaller++
    37. }
    38. return res;
    39. }
    40. function getGCD(a, b) {
    41. while (b != 0) {
    42. let temp = b
    43. b = a % b
    44. a = temp;
    45. }
    46. return a
    47. }
    48. smallestCommons([1,5]);
    1. Drop it ```javascript // 解法1 function dropElements(arr, func) { while(arr.length > 0) { if(!func(arr[0])){ arr.shift() } } return arr; }

    dropElements([1, 2, 3], function(n) {return n < 3; });

    // 解法2 function dropElements(arr, func) { while(arr.length > 0) { if(!func(arr[0])){ arr = arr.slice(1) } } return arr; }

    dropElements([1, 2, 3], function(n) {return n < 3; });

    // 解法3 function dropElements(arr, func) { if (arr.length === 0) { return [] } return !func(arr[0]) ? dropElements(arr.slice(1), func) :arr }

    dropElements([1, 2, 3], function(n) {return n < 3; });

    1. 20. **Steamroller**
    2. ```javascript
    3. // 解法1
    4. function steamrollArray(arr) {
    5. let res = []
    6. for (let item of arr) {
    7. if (!Array.isArray(item)) {
    8. res.push(item)
    9. } else {
    10. res = res.concat(steamrollArray(item))
    11. }
    12. }
    13. return res
    14. }
    15. steamrollArray([1, [2], [3, [[4]]]]);
    16. function steamrollArray(arr) {
    17. let res = []
    18. helper(arr, res)
    19. return res
    20. }
    21. function helper(arr, res) {
    22. for(let item of arr) {
    23. Array.isArray(item) ? helper(item, res): res.push(item)
    24. }
    25. }
    26. steamrollArray([1, [2], [3, [[4]]]]);
    27. // 解法2
    28. function steamrollArray(arr) {
    29. return arr.reduce((acc, cur) => acc.concat(
    30. Array.isArray(cur) ? steamrollArray(cur) : cur
    31. ), [])
    32. }
    1. Sum All Primes

      1. function sumPrimes(num) {
      2. if (num < 2) return 1;
      3. let res = 0;
      4. for(let i = 2; i <= num; i++) {
      5. if (isPrime(i)) {
      6. res += i
      7. }
      8. }
      9. return res;
      10. }
      11. function isPrime(n) {
      12. for (let i= 2; i < n; i++) {
      13. if (n % i === 0) {
      14. return false;
      15. }
      16. }
      17. return true;
      18. }
      19. // 2,3, 5, 7
      20. sumPrimes(10);
    2. Make a Person ```javascript var Person = function(firstAndLast) { // Only change code below this line // Complete the method below and implement the others similarly let fullName = firstAndLast

      this.getFullName = function() { return fullName; };

      this.getFirstName = function() { return fullName.split(‘ ‘)[0] }

      this.getLastName = function() { return fullName.split(‘ ‘)[1] }

      this.setFirstName = function (name) { fullName = name + ‘ ‘ + this.getLastName() }

      this.setLastName = function (name) { fullName = this.getFirstName() + ‘ ‘ + name }

      this.setFullName = function (name) { fullName = name; }

    return this; };

    var bob = new Person(‘Bob Ross’); bob.getFullName();

    1. 22. **Map the Debris**
    2. ```javascript
    3. function orbitalPeriod(arr) {
    4. const GM = 398600.4418;
    5. const earthRadius = 6367.4447;
    6. return arr.map(({ name, avgAlt }) => {
    7. const earth = earthRadius + avgAlt;
    8. const orbitalPeriod = Math.round(2 * Math.PI * Math.sqrt(Math.pow(earth, 3)/GM));
    9. return { name, orbitalPeriod };
    10. });
    11. }
    12. orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);