用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>

 分享结束,谢谢你们。

相关文章
相关标签/搜索