用JS實現迴文數的精準辨別!!!

筆者最近在一邊看《JS高級程序設計3》一邊在FCC上找題目練習啊。那叫一個爽。這不,剛剛用生命在課堂,寢室,實驗室,圖書館等各類場所將第五章「引用類型」搞定,FCC便知趣的給筆者來了個「迴文數」,筆者咬牙切齒,花了兩天時間,又是研究數組,又是研究字符串,又是研究做用域,還看了很長時間的正則表達式。還好,不負有心人,嘿嘿嘿,如今爲你們詳細分享用JS實現精準迴文數的辨別!!!javascript

先給你們看幾個類型的字符串:html

race carjava

not a palindrome正則表達式

A man, a plan, a canal. Panama數組

My age is 0, 0 si ega ym.瀏覽器

0_0 (: /-\ :) 0-0spa

麻煩啊,又是字母,又是數字,還有下劃線,空格,點等等不知道什麼東西。。。
設計

因此,咱們第一步要作的就是,將不是數字和字母的通通去掉!!!code

這裏,用到第一個方法了,名字叫作replace(),這裏咱們重點分享思路,不清楚replace()還有下面一些其它方法的同窗本身去查詢哦。htm

好了,咱們大概的思路是,replace(exp,"").意思就是,匹配全部的非字符,而後去掉它。

那麼問題就來了,正則表達式怎麼匹配全部的非字符呢?

這個問題但是讓我想破了腦殼啊-.-

開始的時候,有朋友建議我用\s後來才知道,它匹配的是空白字符,因此一些符號倒是沒法匹配到的

通過了我對正則表達式的一番研究,加上和朋友的一些探討(登門請教的哦~),終於讓我找到了方法

\W+匹配全部的非字符

由於,\w匹配的是數字,字母,因此\W 就是反義了。

然而還沒完呢,\W它匹配不了下劃線,因此咱們還得再加上\_+

1 var newStr= str.replace(/\W+/g,'');//匹配全部非單詞的字符,替換爲空字符串
2   newStr= newStr.replace(/\_+/g,'');//匹配全部下劃線,替換爲空字符串 
3   newStr=newStr.toLowerCase();

 

到這裏,咱們便解決了大小寫問題和非字符的干擾

接下來,只要利用引用類型裏的方法,肯定它是迴文數就能夠了。

好,咱們的思路是,將獲得的字符串轉換成數組arr1,而後將數組反轉獲得另外一個數組arr2,

只須要for循環兩個數組arr1【i】==arr2【i】,若是是迴文數,那麼毫無疑問,等式是成立的,若是不是迴文數,等式不成立

1 var arr1= newStr.split('');//將獲得的字符串轉換成數組
2   var arr2=arr1.reverse();//將數組反轉,獲得另外一個數組
3   for(i=0;i<arr1.length;i++){
4       if(arr1[i]==arr2[i]){
5           return true;
6       }else{
7           return false;
8       }
9   } 

 

看起來好像沒問題呀~

當我滿懷信心的運行時,瀏覽器並無給我期待的答案:(

問題出在哪裏呢?

不知道你們記不記得數組是什麼類型呢?

對!!!數組是引用類型!!!arr1與arr2都指向同一個堆啊!!!

 

當咱們寫下arr1.reverse()時,這個堆便改變了,反轉了!!!這纔是問題的關鍵!!!因此咱們在for()循環裏比較的居然時兩個一樣的數組!!!(Oh My God!!!)

問題找出來了,怎麼解決?

很簡單,既然數組不行,那我就用基本類型裏的String!!!

咱們將反轉後的數組再轉換成字符串,而後比較兩個字符串

var newStr2=arr2.join('');
  //重構倒序的字符串
  if(newStr==newStr2){//比較1
    return true;
  }else{
   return false;
  }

 

這樣,用JS判斷迴文數的整個思路就出來啦~

下面是完整的代碼,你們能夠複製下來運行下哦

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <title></title>
 6     </head>
 7     <body>
 8         <script type="text/javascript">
 9         function palindrome(str) {
10   // Good luck!
11   var newStr= str.replace(/\W+/g,'');//匹配全部非單詞的字符,替換爲空字符串
12   newStr= newStr.replace(/\_+/g,'');//匹配全部下劃線,替換爲空字符串 
13   newStr=newStr.toLowerCase();
14   //轉化字符串爲小寫
15   var arr1= newStr.split('');
16 ;
17   var arr2=arr1.reverse();
18   
19   var newStr2=arr2.join('');
20   //重構倒序的字符串
21 
22   if(newStr==newStr2){//比較1
23     return true;
24   }else{
25    return false;
26   }
27 }
28 palindrome("not a palindrome");
29 
30         </script>
31     </body>
32 </html>

 分享結束,謝謝你們。

相關文章
相關標籤/搜索