我来教你用JS玩回文数!

作者: BlueBeginner | 来源:发表于2016-10-25 19:41 被阅读0次

笔者最近在一边看《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都指向同一个堆啊!!!
看图!!!


Paste_Image.png

当我们写下arr1.reverse()时,这个堆便改变了,反转了!!!这才是问题的关键!!!所以我们在for()循环里比较的竟然时两个同样的数组!!!(Oh My God!!!)
问题找出来了,怎么解决?
很简单,既然数组不行,那我就用基本类型里的String!!!
我们将反转后的数组再转换成字符串,然后比较两个字符串

var newStr2=arr2.join('');
  //重构倒序的字符串
  if(newStr==newStr2){//比较1
    return true;
  }else{
   return false;
  }

这样,用JS判断回文数的整个思路就出来啦~
下面是完整的代码,大家可以复制下来运行下哦

<!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();
  //转化字符串为小写
  var arr1= newStr.split('');
;
  var arr2=arr1.reverse();
  
  var newStr2=arr2.join('');
  //重构倒序的字符串

  if(newStr==newStr2){//比较1
    return true;
  }else{
   return false;
  }
}
palindrome("not a palindrome");

        </script>
    </body>
</html>

分享结束,谢谢大家,写作不易,点个赞吧!

相关文章

  • 我来教你用JS玩回文数!

    笔者最近在一边看《JS高级程序设计3》一边在FCC上找题目练习啊。那叫一个爽。这不,刚刚用生命在课堂,寝室,实验室...

  • 45.判断是否是回文字符串

    day1:js基础->算法。回文数[https://leetcode-cn.com/problems/palind...

  • 回文数最优解

    回文数 非回文数 JAVA 解法

  • leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右...

  • 2019-04-22

    手摸手教你用 js 写一个 js 解释器 用 js 来 编译 js 看起来是个高大上的东西,实际原理其实很简单,无...

  • Leetcode(9) - 回文数 - java版

    Leetcode(9) - 回文数 - java版 题目 难度: 简单 判断一个整数是否是回文数。回文数是指正序...

  • ARTS-Week3 回文数、内存泄漏排查、DWR框架

    Algorithm:回文数判断 LeetCode原题链接 题目: 判断一个整数是否是回文数。回文数是指正序(从左向...

  • java笔试题(一)

    1.回文数Palindrome Number 判断一个整数是佛是回文数,回文数是指正序(从左到右)和倒序(从右到左...

  • LeetCode(PHP)之回文数

    题目:回文数(Palindrome Number) 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从...

  • LeetCode9.回文数 JavaScript

    LeetCode9.回文数 JavaScript 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右...

网友评论

    本文标题:我来教你用JS玩回文数!

    本文链接:https://www.haomeiwen.com/subject/xwaruttx.html