筆者最近在一邊看《JS高級程序設(shè)計3》一邊在FCC上找題目練習(xí)啊。那叫一個爽邪锌。這不勉躺,剛剛用生命在課堂,寢室觅丰,實驗室饵溅,圖書館等各種場所將第五章“引用類型”搞定,F(xiàn)CC便知趣的給筆者來了個“回文數(shù)”舶胀,筆者咬牙切齒概说,花了兩天時間碧注,又是研究數(shù)組,又是研究字符串糖赔,又是研究作用域萍丐,還看了很長時間的正則表達式。還好放典,不負有心人逝变,嘿嘿嘿,現(xiàn)在為大家詳細分享用JS實現(xiàn)精準(zhǔn)回文數(shù)的辨別7芄埂?怯啊!
先給大家看幾個類型的字符串:
race car
not a palindrome
A man, a plan, a canal. Panama
My age is 0, 0 si ega ym.
0_0 (: /-\ :) 0-0
麻煩啊弥臼,又是字母宴咧,又是數(shù)字,還有下劃線径缅,空格掺栅,點等等不知道什么東西。纳猪。氧卧。
所以,我們第一步要做的就是氏堤,將不是數(shù)字和字母的統(tǒng)統(tǒng)去掉I尘!鼠锈!
這里闪檬,用到第一個方法了,名字叫做replace(),這里我們重點分享思路脚祟,不清楚replace()還有下面一些其它方法的同學(xué)自己去查詢哦谬以。
好了,我們大概的思路是由桌,replace(exp,"").意思就是为黎,匹配所有的非字符,然后去掉它行您。
那么問題就來了铭乾,正則表達式怎么匹配所有的非字符呢?
這個問題可是讓我想破了腦袋啊-.-
開始的時候娃循,有朋友建議我用\s后來才知道炕檩,它匹配的是空白字符,所以一些符號卻是無法匹配到的
經(jīng)過了我對正則表達式的一番研究,加上和朋友的一些探討(登門請教的哦~)笛质,終于讓我找到了方法
\W+匹配所有的非字符
因為泉沾,\w匹配的是數(shù)字,字母妇押,所以\W 就是反義了跷究。
然而還沒完呢,\W它匹配不了下劃線敲霍,所以我們還得再加上_+
1 var newStr= str.replace(/\W+/g,'');//匹配所有非單詞的字符俊马,替換為空字符串
2 newStr= newStr.replace(/\_+/g,'');//匹配所有下劃線,替換為空字符串
3 newStr=newStr.toLowerCase();
到這里肩杈,我們便解決了大小寫問題和非字符的干擾
接下來柴我,只要利用引用類型里的方法,確定它是回文數(shù)就可以了扩然。
好艘儒,我們的思路是,將得到的字符串轉(zhuǎn)換成數(shù)組arr1夫偶,然后將數(shù)組反轉(zhuǎn)得到另一個數(shù)組arr2,
只需要for循環(huán)兩個數(shù)組arr1【i】==arr2【i】彤悔,如果是回文數(shù),那么毫無疑問索守,等式是成立的,如果不是回文數(shù)抑片,等式不成立
1 var arr1= newStr.split('');//將得到的字符串轉(zhuǎn)換成數(shù)組
2 var arr2=arr1.reverse();//將數(shù)組反轉(zhuǎn),得到另一個數(shù)組
3 for(i=0;i<arr1.length;i++){
4 if(arr1[i]==arr2[i]){
5 return true;
6 }else{
7 return false;
8 }
9 }
看起來好像沒問題呀~
當(dāng)我滿懷信心的運行時卵佛,瀏覽器并沒有給我期待的答案:(
問題出在哪里呢?
不知道大家記不記得數(shù)組是什么類型呢敞斋?
對=赝簟!植捎!數(shù)組是引用類型Q媒狻!焰枢!arr1與arr2都指向同一個堆膀韭汀!<贸暑椰!
看圖!<鼍一汽!
當(dāng)我們寫下arr1.reverse()時,這個堆便改變了低滩,反轉(zhuǎn)了U偌小Q遗纭!這才是問題的關(guān)鍵<嘣鳌I匆狻!所以我們在for()循環(huán)里比較的竟然時兩個同樣的數(shù)組7懵病8狙ā!(Oh My God!!!)
問題找出來了隶债,怎么解決腾它?
很簡單,既然數(shù)組不行死讹,那我就用基本類型里的StringB鞯巍!赞警!
我們將反轉(zhuǎn)后的數(shù)組再轉(zhuǎn)換成字符串妓忍,然后比較兩個字符串
var newStr2=arr2.join('');
//重構(gòu)倒序的字符串
if(newStr==newStr2){//比較1
return true;
}else{
return false;
}
這樣,用JS判斷回文數(shù)的整個思路就出來啦~
下面是完整的代碼愧旦,大家可以復(fù)制下來運行下哦
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<script type="text/javascript">
function palindrome(str) {
// Good luck!
var newStr= str.replace(/\W+/g,'');//匹配所有非單詞的字符世剖,替換為空字符串
newStr= newStr.replace(/\_+/g,'');//匹配所有下劃線,替換為空字符串
newStr=newStr.toLowerCase();
//轉(zhuǎn)化字符串為小寫
var arr1= newStr.split('');
;
var arr2=arr1.reverse();
var newStr2=arr2.join('');
//重構(gòu)倒序的字符串
if(newStr==newStr2){//比較1
return true;
}else{
return false;
}
}
palindrome("not a palindrome");
</script>
</body>
</html>
分享結(jié)束笤虫,謝謝大家旁瘫,寫作不易,點個贊吧琼蚯!