笔者最近在一边看《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. Covarience And ContraVariance

    using System; using System.Collections.Generic; using System.IO; namespace CovarientAndContraVarient ...

  2. Codeforces Round #277 (Div. 2) E. LIS of Sequence DP

    E. LIS of Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/pr ...

  3. 常见AutoCAD病毒(acad.fas、acad.lsp)清除方法

    常见AutoCAD病毒(acad.fas.acad.lsp)清除方法 acad.fas.acad.lsp这两种病毒是最常见的CAD病毒了,而且往往同一时候出现.因为其本身对系统并不具备危害性,不过恶作 ...

  4. CSS里的单位

    CSS中预设了16种颜色以及16种颜色的衍生色,这16种颜色是CSS规范推荐的.并且一些主流的浏览器都可以识别.例如以下表所看到的: 十六进制颜色是最经常使用的定义方式.它的基本格式为#RRGGBB, ...

  5. [AngularJS] Javascript scope and AngularJS $scope

    Scope resolution of our Angular documents works exactly the same way scope resolution works in plain ...

  6. 也来一篇关于Infragistics WPF Report的使用教程 (一)

    前言 Infragistics Report是一款比較灵活的报表控件, 比微软的rdlc控件至少在页面打印上, 页面的控制比較好调整. 这里使用的是Infragistics Ultimate  v14 ...

  7. MHA手动切换 原创2 (主参与复制)

    monitor 执行下面命令后, --orig_master_is_new_slave :原主变为新从,即server1变成了slave1的从.slave2跟据app1.conf中配制也变成了slav ...

  8. DataTable 的数据导出到 Excel

    如果有个DataTable类型的数据,可以这样导出到Excel中: public static void ExportToExcel(DataTable dt, string fileName) { ...

  9. Github 的一些基本操作

    1.创建一个新的repository: 先在github上创建并写好相关名字,描述.例如这样一个地址: https://github.com/test/test2.git 回到本地目录如hellowo ...

  10. 奥运会订票系统c语言代写源码下载

    制作能够实现2008北京奥运会网上订票的系统,能够实现购票人员注册.购票.管理人员可以设置各个比赛场地的赛事安排及票数. 程序要求实现的功能如下: 购票者信息注册:购票者可以用昵称和身份证进行注册,若 ...