liushuangls / memo

用于记录
1 stars 0 forks source link

freeCodeCamp Algorithm #33

Open liushuangls opened 7 years ago

liushuangls commented 7 years ago

basic

Check for Palindromes

function palindrome(str) {
  // 请把你的代码写在这里
  str = str.replace(/[\W_]/g, '').toLowerCase();
  return str === str.split('').reverse().join('');
}
palindrome("dafa.dafa afa");

Repeat a string repeat a string

function repeat(str, num) {
  // 请把你的代码写在这里
  var a = [];
  while (a.length < num) {
    a.push(str);
  }
  return a.join('');
}

Truncate a string

function chunk(arr, size) {
  // 请把你的代码写在这里
  var arr1 = [], i = 0;
  while (i < arr.length) {
    arr1.push(arr.slice(i, i += size));
  }
  return arr1;
}

Mutations

function mutation(arr) {
  // 请把你的代码写在这里
  for (let x of arr[1].toLowerCase()) {
    if (arr[0].toLowerCase().indexOf(x) < 0) return false;
  }
  return true;
}
liushuangls commented 6 years ago

intermediate

Diff Two Arrays

function diff(arr1, arr2) {
  let newArr = [];
  let a1, a2;
  a1 = arr1.filter((e) => {
    return arr2.indexOf(e) < 0;
  });
  a2 = arr2.filter((e) => {
    return arr1.indexOf(e) < 0;
  });
  newArr.push(...a1);
  newArr.push(...a2);
  return newArr;
}

Roman Numeral Converter(将给定的数字转换成罗马数字。)

function convert(num) {
  let Rnum = [];
  const symbols = ['I', 'V', 'X', 'L', 'C', 'D', 'M'];
  let numArr = ('' + num).split('').reverse();
  numArr.forEach((e, i) => {
    if (e <= 3) Rnum.push(symbols[i * 2].repeat(+e));
    else if (e == 4) Rnum.push(symbols[i * 2] + symbols[i * 2 + 1]);
    else if (e > 4 && e <= 8) Rnum.push(symbols[i * 2 + 1] + symbols[i * 2].repeat(+e - 5));
    else if (e == 9) Rnum.push(symbols[i * 2] + symbols[i * 2 + 2]);
  }); 
 return Rnum.reverse().join('');
}

Sum All Odd Fibonacci Numbers

function sumFibs(num) {
  let [a, b] = [0, 1];
  let fib = [];
  let total = 0;
  while(b <= num) {
    fib.push(b);
    [a, b] = [b, a + b];
  }
  fib.forEach(e => {
    if (e % 2 !== 0) total += e;
  });
  return total;
}

Sum All Primes

// 埃氏筛法
function sumPrimes(num) {
  let primes = [2];
  let cur = primes[0];
  let total = 0;
  for (let i = 3; i <= num; i += 2) {
    primes.push(i);
  }
  while (cur <= num) {
    total += cur;
    primes = primes.filter(e => e % cur !== 0);
    cur = primes[0];
  }
  return total;
}

Smallest Common Multiple

function smallestCommons(arr) {
  let max = Math.max(...arr);
  let min = Math.min(...arr);
  let numArr = [];
  let [multiple, noFind] = [max, true];
  for (let i = min; i <= max; i++) {
    numArr.push(i);
  }
  while (noFind) {
    let find = true;
    numArr.forEach(e => {
      if (multiple % e !== 0) find = false;
    });
    if (find) noFind = false;
    else multiple += max;
  }

  return multiple;
}

Steamroller(对嵌套的数组进行扁平化处理。)

function steamroller(arr) {
  // I'm a steamroller, baby
  let newArr = [];
  function recurse(arr) {
    for (let i = 0, len = arr.length; i < len; i++) {
      if (!Array.isArray(arr[i])) {
        newArr.push(arr[i]);
      } else {
        recurse(arr[i]);
      }
    }
  }
  recurse(arr);
  return newArr;
}
liushuangls commented 6 years ago

advanced

Validate US Telephone Numbers

function telephoneCheck(str) {
  str = str.replace(/\s/g, '');
  while (true) {
    let match = /\d+-\d+/g.exec(str);
    if (!match) break;
    str = str.replace(/\d+-\d+/g, match[0].split('-').join(''));
  }
  if (/\(\d+\)/g.test(str)) {
    str = str.replace(/[()]/g, '');
  }
  if (isNaN(Number(str))) return false;
  if (str.length === 11 && str[0] != 1) return false;
  if (str.length > 11 || str.length < 10) return false;
  if (str.length === 10 && str[0] != 5) return false;
  return true;
}

Exact Change

function checkCashRegister(price, cash, cid) {
  const denominations = { "PENNY": 1, "NICKEL": 5, "DIME": 10, "QUARTER": 25, "ONE": 100, "FIVE": 500, "TEN": 1000, "TWENTY": 2000, "ONE HUNDRED": 10000 };
  let change = cash * 100 - price * 100;
  const register = cid.reverse().map(el => [el[0], el[1]*100]);
  const registerTotal = register.reduce((sum, elem) => sum + elem[1], 0);

  if (change > registerTotal ) return "Insufficient Funds";
  if (change === registerTotal ) return "Closed";

  let partial;
  let changeArr = register.reduce((acc, elem) => { 
    partial = Math.min(elem[1], Math.floor(change/ denominations[elem[0]]) * denominations[elem[0]]);
    if ( partial > 0 ) {
      change -= partial;
      acc.push([elem[0], partial / 100]);
    } return acc;
  }, []);

  if (change > 0 ) return "Insufficient Funds";

  return changeArr;
}