freeCodeCamp JS 算法和数据结构项目

222 阅读1分钟

背景

JS 算法和数据结构项目

回文检查器

回文检查器

function palindrome(str) {
  const str1 = str.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
  let left = 0;
  let right = str1.length - 1;
  while (left < right && str1[left] === str1[right]) {
    left++;
    right--;
  }

  return str1[left] === str1[right];
}

palindrome("eye");

罗马数字转换器

function convertToRoman(num) {
  var roman =  {"M" :1000, "CM":900, "D":500, "CD":400, "C":100, "XC":90, "L":50, "XL":40, "X":10, "IX":9, "V":5, "IV":4, "I":1};
  var str = "";

  for (var i of Object.keys(roman) ) {
    var q = Math.floor(num / roman[i]);
    num -= q * roman[i];
    str += i.repeat(q);
  }

  return str;
}

convertToRoman(36);

凯撒密码

function rot13(str) {
  let left = 'A'.charCodeAt();
  let right = 'Z'.charCodeAt();
  return str.replace(/[A-Z]/g, match => {
    let code = match.charCodeAt() - 13;
    if (code < left) {
      code = match.charCodeAt() + 13;
    }
    return String.fromCharCode(code)
  });
}

rot13("SERR PBQR PNZC");

电话号码检查器

function telephoneCheck(str) {
    let rex1 = /^(1\s?)?\d{3}([-\s]?)\d{3}\2\d{4}$/,
        rex2 = /^(1\s?)?\(\d{3}\)\s?\d{3}[-\s]?\d{4}$/;

    if (rex1.test(str)) {
        return true;
    }
    else {
        return rex2.test(str) ? true : false
    }
}

telephoneCheck("555-555-5555");

计算找零

计算找零

function checkCashRegister(price, cash, cid) {
  const denomination = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1,];

  function transaction(price, cash, cid) {
    let changeNeeded = (cash - price) * 100;
    let moneyProvided = [
    ["ONE HUNDRED", 0], 
    ["TWENTY", 0], 
    ["TEN", 0], 
    ["FIVE", 0], 
    ["ONE", 0], 
    ["QUARTER", 0], 
    ["DIME", 0], 
    ["NICKEL", 0], 
    ["PENNY", 0],
  ];
  let availCash = [...cid].reverse().map(el => [el[0], el[1] * 100]);
  let sumOfCash = availCash.reduce((a, b) => (a + b[1]),0) / 100;
  if (sumOfCash === changeNeeded / 100) {
    return {status: "CLOSED", change: [...cid]};
  }
  else for (let i = 0; i < availCash.length; i++) {
      while (denomination[i] <= changeNeeded && availCash[i][1] > 0) {
        moneyProvided[i][1] += denomination[i];
        changeNeeded -= denomination[i];
        availCash[i][1] -= denomination[i];
      }
    };
    
    let change = moneyProvided
    .map(el => [el[0], el[1] / 100])
    .filter(el => el[1] !== 0);
    let changeTotal = change.reduce((a, b) => (a + b[1]),0);
    if (changeTotal < changeNeeded) {
        return {status: "INSUFFICIENT_FUNDS", change: []};
    }
    return {status: "OPEN", change};
  }

  let answer = transaction(price, cash, cid);
  return answer;
}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);