FCC参阅笔记之有趣的算法(上)

10 篇文章 0 订阅
3 篇文章 0 订阅

有趣的算法

  • 如果给定的字符串是回文,返回true,反之,返回false
function palindrome(str) {
  str = str.replace(/[^A-Za-z0-9]/g, '').toLowerCase();
  var x = str.split('');
  var t = x.every(function(v,i){
    return v == x[x.length-i-1];
  },x);
  //return str.replace(/[^A-Za-z0-9]/g, '').toLowerCase().split('').every(function(v,i,that){return v == that[that.length-i-1]})
  return t;
}
  • 字符串的每个单词首字母都大写,其余部分小写。
function titleCase(str) {
  var temparr = str.toLowerCase().split(' ');
  var res = temparr.map(function(v,i){
    
    return v.replace(/^[a-zA-Z]{1}/,v[0].toUpperCase());
  });
  return res.join(' ');
}
  • 将给定的数字转换成罗马数字。
function convert(num) {
  var numStr = String(num);
  var len = numStr.length;
  var numArr = numStr.split('');
  var result = '';
  var chart = {
    1: 'I',
    2: 'V',
    3: 'X',
    4: 'L',
    5: 'C',
    6: 'D',
    7: 'M'
  };
  numArr.forEach(function(v,i){
    var tlen = len-i;
    var temp = '';
    if (tlen>3) {
      temp = chart['7'].repeat(v);
    } else {
      if (v<4) {
        temp = chart[tlen*2-1].repeat(v);
      } else if (v==4) {
        temp = chart[tlen*2-1]+chart[tlen*2];
      } else if (v==5) {
        temp = chart[tlen*2];
      } else if (v>5 && v<9) {
        temp = chart[tlen*2]+chart[tlen*2-1].repeat(v-5);
      } else if (v==9) {
        temp = chart[tlen*2-1]+chart[tlen*2+1];
      } else {
        throw new Error('未知的错误');
      }
    }
    result += temp;
  });
 return result;
}
  • Find the stray number
    给定一个奇数个元素的数组,他们的值是相同的,除了一个值不同,找出这个不同的值。
    example:[1, 1, 2] ==> 2
    解法有三种:
// 第一种:通过数组的indexOf和lastIndexOf方法判断该元素是否在数组中唯一
function stray(arr) {
    for (const val of arr) {
        if (arr.indexOf(val) === arr.lastIndexOf(val)) return val
    }	
}
// 第二种:判断该元素的兄弟元素是否也与它相同
function stray(numbers) {
  for (let i = 1,len = numbers.length;i < len;i++) {
    const num = numbers[i]
    if (num !== numbers[i-1] && num !== numbers[i+1]) {
      return num
    }
  }
}
// 第三种:因为是数组个数为奇数个,所以我们可以用^运算符,思路来源于codewars
const stray = numbers => numbers.reduce(a, b) => a ^ b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值