笔者最近在一边看《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它匹配不了下划线,所以我们还得再加上\_+

 var newStr= str.replace(/\W+/g,'');//匹配所有非单词的字符,替换为空字符串
newStr= newStr.replace(/\_+/g,'');//匹配所有下划线,替换为空字符串
newStr=newStr.toLowerCase();

到这里,我们便解决了大小写问题和非字符的干扰

接下来,只要利用引用类型里的方法,确定它是回文数就可以了。

好,我们的思路是,将得到的字符串转换成数组arr1,然后将数组反转得到另一个数组arr2,

只需要for循环两个数组arr1【i】==arr2【i】,如果是回文数,那么毫无疑问,等式是成立的,如果不是回文数,等式不成立

 var arr1= newStr.split('');//将得到的字符串转换成数组
var arr2=arr1.reverse();//将数组反转,得到另一个数组
for(i=0;i<arr1.length;i++){
if(arr1[i]==arr2[i]){
return true;
}else{
return false;
}
}

看起来好像没问题呀~

当我满怀信心的运行时,浏览器并没有给我期待的答案:(

问题出在哪里呢?

不知道大家记不记得数组是什么类型呢?

对!!!数组是引用类型!!!arr1与arr2都指向同一个堆啊!!!

当我们写下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实现回文数的精准辨别!!!的更多相关文章

  1. js回文数的四种判断方法

    目录 1. 字符串的转换 1.1 简单点,使用高阶函数来完成 1.2 从后往前循环字符串数组 1.3 以中间数为节点,判断左右两边首尾是否相等 2. 数字转换 2.1 求模得尾数,除10得整数 判断一 ...

  2. 回文数 js 解法

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  3. 判断一个数是否为回文数(js)

    //判断是否为回文数:若n=1234321,则称n为一回文数 let readline = require("readline-sync"); let newNum = 0; co ...

  4. hdu1282回文数猜想

    Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其 ...

  5. C语言 · 特殊回文数

    问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 输入格式 输入一行,包含一个正整数n. 输 ...

  6. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  7. luogu1207双重回文数[usaco1.2]Dual Palindromes

    题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上 ...

  8. luogu10125回文数[noip1999 Day1 T1]

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  9. 洛谷 P1015 回文数 Label:续命模拟QAQ

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

随机推荐

  1. Android ViewPager使用具体解释

    这是谷歌官方给我们提供的一个兼容低版本号安卓设备的软件包,里面包囊了仅仅有在安卓3.0以上能够使用的api.而viewpager就是当中之中的一个利用它,我们能够做非常多事情,从最简单的导航,到页面菜 ...

  2. BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  3. URAL 1776 C - Anniversary Firework DP

    C - Anniversary FireworkTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/c ...

  4. 和Timesten有个约会--Timesten技术专栏系列(一)

    作者: 三十而立 时间:2009年10月03日 12:08:42 本文出自 “inthirties(三十而立)”博客,转载请务必注明作者和保留出处http://blog.csdn.net/inthir ...

  5. graylog2 架构--转载

    原文地址:http://docs.graylog.org/en/latest/pages/architecture.html Architectural considerations There ar ...

  6. 小白日记24:kali渗透测试之提权(四)--利用漏洞提权

    利用漏洞提权实例 前提:已渗透进一个XP或2003系统 一.实验目标漏洞:Ms11-080 补丁:Kb2592799 漏洞信息:https://technet.microsoft.com/librar ...

  7. iOS开发之 动画CoreAnimation

    http://blog.treney.com/index.php/archives/CoreAnimation.html?hmsr=toutiao.io&utm_medium=toutiao. ...

  8. android初学-togglebutton

    1.属性:textOn &textOff &checked 2.使用: 1)初始化:TB: 2)设置监听器:TB.setOnCheckedChangeListener(listener ...

  9. gulp构建工具的安装

    第一步:node.js安装 在gulp安装之前,本机需要node环境.访问http://nodejs.org,然后点击大大的绿色的install按钮,下载完成后直接运行程序.npm会随着安装包一起安装 ...

  10. [改善Java代码]使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...