筆者最近在一邊看《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>
分享結束,謝謝大家。