zoukankan      html  css  js  c++  java
  • 用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>

     分享结束,谢谢大家。

  • 相关阅读:
    用Python实现多核心并行计算
    Sublime Text 中文乱码
    Python_pickle
    New blog
    git Bash常用命令
    用TTS实现文本转语音
    bc#54 div2
    用Python制作新浪微博爬虫
    hdu5000 背包dp
    mac下配置Qt for Android+iOS
  • 原文地址:https://www.cnblogs.com/zhouliang/p/5990237.html
Copyright © 2011-2022 走看看