回文(palindrome)

描述

若是一个字符串忽略标点符号、大小写和空格,正着读和反着读如出一辙,那么这个字符串就是palindrome(回文)。javascript

注意你须要去掉字符串多余的标点符号和空格,而后把字符串转化成小写来验证此字符串是否为回文。java

  • no bb,show me your code!
function palindrome(str) {

  // 全局匹配全部非 [0-9a-zA-Z]以及下划线'-'
  var reg = /[\W_]/g;
  
  // 用 '' 来替换掉全部的非[\w_],或者  /[^0-9a-zA-Z]/g
  var originStr = str.toLowerCase().replace(reg, ''); 

  var reverseStr = originStr.split('').reverse().join('');
  
  return originStr === reverseStr;
}

palindrome("hello javascript");
复制代码
  • 来分析一波
  1. 正则表达式中的特殊字符,这里只列出此例中用到的。

使用 str.replace(/[^0-9a-zA-Z]/g, ''),全局搜索,删除掉全部的除数字大小写字母之外的字符。str.split('')方法将字符串分割成单个字符串的数组,arr.join('')方法将数组转化成字符串。

  • 再来看看for循环怎么实现
function palindrome(str) {
  var reg = /[^0-9a-zA-Z]/g;
  var originStr = str.toLowerCase().replace(reg, '');
  var len = originStr.length; // 获取到字符串的长度
 
  // 定义halfLen = len / 2,
  for (var i = 0 , halfLen = len / 2; i < halfLen; i++ ){
    // 若是第一个与最后一个,第二个和倒数第二个...等等,不相等的话
    // 就说明此字符串不是回文字符串
    if(originStr[i] !== originStr[len-1-i]){
      return false;
    }
  }
  return true;
}
palindrome("hello world");
复制代码
  • 最后,尾调用,来看下维基百科的描述:

在计算机学里,尾调用是指一个函数里的最后一个动做是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接被当前函数的返回结果。[1]此时,该尾部调用位置被称为尾位置。尾调用中有一种重要而特殊的情形叫作尾递归。通过适当处理,尾递归形式的函数的运行效率能够被极大地优化。[1]尾调用原则上均可以经过简化函数调用栈的结构而得到性能优化(称为“尾调用消除”),可是优化尾调用是否方即可行取决于运行环境对此类优化的支持程度如何。正则表达式

function palindrome(str) {
  var re = /[\W_]/g; // 匹配全部非数字大小写字母以及 '_'
  var lowRegStr = str.toLowerCase().replace(re, ''); // 删除
  if (lowRegStr.length === 0) {
    return true; // 表示是回文字符串
  }
  
  if (lowRegStr[0] !== lowRegStr[lowRegStr.length - 1]) {
    return false;
  } else {
    return palindrome(lowRegStr.slice(1, lowRegStr.length -1));
  }
  
}
palindrome("you did a greet job!");
复制代码
相关文章
相关标签/搜索