筆者最近在一邊看《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('');//
將得到的字串轉換成陣列
2var arr2=arr1.reverse();//
將陣列反轉,得到另乙個陣列
3for(i=0;i)else
9 }
當我滿懷信心的執行時,瀏覽器並沒有給我期待的答案:(
問題出在**呢?
不知道大家記不記得陣列是什麼型別呢?
對!!!陣列是引用型別!!!arr1與arr2都指向同乙個堆啊!!!
當我們寫下arr1.reverse()時,這個堆便改變了,反轉了!!!這才是問題的關鍵!!!所以我們在for()迴圈裡比較的竟然時兩個同樣的陣列!!!(oh my god!!!)
問題找出來了,怎麼解決?
很簡單,既然陣列不行,那我就用基本型別裡的string!!!
我們將反轉後的陣列再轉換成字串,然後比較兩個字串
var newstr2=arr2.join('');這樣,用js判斷回文數的整個思路就出來啦~//重構倒序的字串
if(newstr==newstr2)
else
下面是完整的**,大家可以複製下來執行下哦
1237分享結束,謝謝大家。83132
用python實現特殊回文數
問題描述 123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入格式 輸入一行,包含乙個正整數n。輸出格式 按從小到大的順序輸出滿足條件的整數,每個整數佔一行。樣例輸入 52樣例輸出 899998 989...
回文數的golang實現
判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數 輸入 121 輸出 true 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。輸入 10輸出 false 解釋 從右向左讀,為 01 因此它不是乙個回文...
leetcode(1)回文數的js實現
判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10 輸出 false 解釋 從右向左...