用javascript來判別回文數


  什么是回文數?通俗的說就是正着讀和倒着讀都一樣的字符串(即使是數字也是可以看成字符串的)。

  所以下面回文數都是用字符串來表示的,即判斷回文數就是對字符串的判斷。

  舉幾個回文數的例子:

    i love u evol i        

    9 99899 9

    但是要是判斷類似這樣的字符串時需要去除掉非字母和數字的字符再來判斷 0.0 } ==me== { 0.0

    由於我們這里的回文數指的是字母和數字組成的,所以我們判斷是否為回文數是在去掉了所有的字母和數字之后再判斷的。

    並且我們還規定了回文數中不區分大小寫,大寫字母和小寫字母同樣對待。

  下面截取一段來自W3Cschool上面的replace()的介紹。需要看詳情的請點擊這里。戳我看replace()的詳細用法

下面介紹javascript的split()方法,可以由字符串返回數組,想要知道詳細關於字符串的split()的用法的請戳這里

我先寫的一個是如下的版本:

var exp1 = "/\w+/g"; //匹配非字符的正則表達式,但是注意無法匹配到下划線_
var exp2 = "/\_+/g";  //匹配下划線_

//在javascript中可以用split()將字符串轉換成字符數組

//如果不區分大小寫則用下面的compare1()函數
var compare1 = function(str){
  var newstr = str.replace(exp1,"");  //將所有非字符替換成空字符串
  newstr = newstr.replace(exp2,""); //將所有下划線替換成空字符
  var low_newstr = newstr.toLowerCase();  //將字符串全部轉換成小寫字母的形式
  var array1 = newstr.split("");  //將空字符串作為分隔符將字符串轉換成數組
  var array2 = array1.reverse();  //將生成的數組倒序生成新的數組
  if(array1 === array2){  // 比較兩個數組是否相同
    return true;
  }else{
    return false;
  }
}

//如果區分大小寫的話,則用下面的compare2()函數
var compare2 = function(str){
  var newstr = str.replace(exp1,"");  //將所有非字符替換成空字符串
  newstr = newstr.replace(exp2,""); //將所有下划線替換成空字符
  var array1 = newstr.split("");  //將空字符串作為分隔符將字符串轉換成數組
  var array2 = array1.reverse();  //將生成的數組倒序生成新的數組
  if(array1 === array2){  // 比較兩個數組是否相同
    return true;
  }else{
    return false;
  }
}

var str = "cAru rac ";
console.log(compare1(str));
console.log(compare2(str));

 

但是如果我這樣寫的話,就會出現即使是大小寫不同的時候,我們也無法區分,都會返回true的這種奇怪的錯誤。可是按照常理來說數組倒序之后不是和原來不相同了嗎?

  為什么呢?在javascript中得格外注意引用類型的復制問題。很多像我一樣的初學javascript的人都會無意間犯這個錯誤,還在用C語言那種嚴格類型的數組來想當然的用jsvascript的數組。錯誤的原因就是javascript中的Array類型是引用類型,是弱類型。兩個數組實際上都是在操作存儲在同一個內存中的數組。

注意有個大坑:在javascript中我們不能用"=="或者"==="來比較對象是否內容相等,===或者==只是用來比較是否是同一個對象,換句話說只有當連個對象的引用相同的時候才會返回true。這里我用了自己寫的循環來判斷是否兩個數組呢容是否相等。在Stackflow上面也有人用更好的辦法來實現比較兩個數組,這里貼上傳送門

所以我們正確的代碼應該如下:

//先寫一個字符串的預處理函數
var preprocess = function(str){
  str = str.replace(/\W+/g,"");  //將所有非字符替換成空字符串,注意這里的W是大寫
  str = str.replace(/\_+/g,""); //將所有下划線替換成空字符
  return str;
};

var finalcompare = function(array1,array2){
    for(var i=0;i<array1.length;i++){
      if(array1[i] != array2[i]){
        return false;
        break;
      }
    }
    return true;
}

//如果不區分大小寫則用下面的compare1()函數,區分大小寫的話就用下面的compare2()函數
var compare1 = function(str){
  var newstr = preprocess(str);
  var array1 = newstr.split("");  //將空字符串作為分隔符將字符串轉換成數組
  var array2 = newstr.split("");  //不使用數組引用類型之間的復制
  array2 = array2.reverse();
  return finalcompare(array1,array2);
};
var compare2 = function(str){
  var newstr = preprocess(str);
  var newstr = newstr.toLowerCase();  //將字符串全部轉換成小寫字母的形式
  var array1 = newstr.split("");  //將空字符串作為分隔符將字符串轉換成數組
  var array2 = newstr.split("");  //不使用數組引用類型之間的復制
  array2 = array2.reverse();
  return finalcompare(array1,array2);
};

var str = "cat ac";
console.log(compare1(str));
console.log(compare2(str));

下面是在chrome的console里面的測試結果,親測無誤。

 或者也可以將Array類型轉化為String類型來比較。

var array = ["a","b","A"];
var compare = function(array){
  var str1 = array.toString();
  var str2 = array.reverse().toString();
  if(str1 == str2){
    return true;
  }
  return false;
};
compare(array);

 我可能寫的不是很簡潔明了,我詳細寫出了我在寫的時候踩着的坑,希望給看的人一定的警示作用吧,也希望我以后不會再犯吧。

 

可以參考下比較好的一篇的博文:點我傳送


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM