用JS實現回文數的精准辨別!!!


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

先給大家看幾個類型的字符串:

race car

not a palindrome

A man, a plan, a canal. Panama

My age is 0, 0 si ega ym.

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

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

所以,我們第一步要做的就是,將不是數字和字母的統統去掉!!!

這里,用到第一個方法了,名字叫做replace(),這里我們重點分享思路,不清楚replace()還有下面一些其它方法的同學自己去查詢哦。

好了,我們大概的思路是,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>

 分享結束,謝謝大家。

 


免責聲明!

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



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