迴文(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!");
複製代碼
相關文章
相關標籤/搜索