用javascript来判别回文数
什么是回文数?通俗的说就是正着读和倒着读都一样的字符串(即使是数字也是可以看成字符串的)。
所以下面回文数都是用字符串来表示的,即判断回文数就是对字符串的判断。
举几个回文数的例子:
i love u evol i
9 99899 9
但是要是判断类似这样的字符串时需要去除掉非字母和数字的字符再来判断 0.0 } ==me== { 0.0
由于我们这里的回文数指的是字母和数字组成的,所以我们判断是否为回文数是在去掉了所有的字母和数字之后再判断的。
并且我们还规定了回文数中不区分大小写,大写字母和小写字母同样对待。
下面截取一段来自W3Cschool上面的replace()的介绍。需要看详情的请点击这里。戳我看replace()的详细用法

下面介绍javascript的split()方法,可以由字符串返回数组,想要知道详细关于字符串的split()的用法的请戳这里。

我先写的一个是如下的版本:
var exp1 = "/\w+/g"; //匹配非字符的正则表达式,但是注意无法匹配到下划线_
var exp2 = "/\_+/g"; //匹配下划线_ //在javascript中可以用split()将字符串转换成字符数组 //如果不区分大小写则用下面的compare1()函数
var compare1 = function(str){
var newstr = str.replace(exp1,""); //将所有非字符替换成空字符串
newstr = newstr.replace(exp2,""); //将所有下划线替换成空字符
var low_newstr = newstr.toLowerCase(); //将字符串全部转换成小写字母的形式
var array1 = newstr.split(""); //将空字符串作为分隔符将字符串转换成数组
var array2 = array1.reverse(); //将生成的数组倒序生成新的数组
if(array1 === array2){ // 比较两个数组是否相同
return true;
}else{
return false;
}
} //如果区分大小写的话,则用下面的compare2()函数
var compare2 = function(str){
var newstr = str.replace(exp1,""); //将所有非字符替换成空字符串
newstr = newstr.replace(exp2,""); //将所有下划线替换成空字符
var array1 = newstr.split(""); //将空字符串作为分隔符将字符串转换成数组
var array2 = array1.reverse(); //将生成的数组倒序生成新的数组
if(array1 === array2){ // 比较两个数组是否相同
return true;
}else{
return false;
}
} var str = "cAru rac ";
console.log(compare1(str));
console.log(compare2(str));

但是如果我这样写的话,就会出现即使是大小写不同的时候,我们也无法区分,都会返回true的这种奇怪的错误。可是按照常理来说数组倒序之后不是和原来不相同了吗?
为什么呢?在javascript中得格外注意引用类型的复制问题。很多像我一样的初学javascript的人都会无意间犯这个错误,还在用C语言那种严格类型的数组来想当然的用jsvascript的数组。错误的原因就是javascript中的Array类型是引用类型,是弱类型。两个数组实际上都是在操作存储在同一个内存中的数组。
注意有个大坑:在javascript中我们不能用"=="或者"==="来比较对象是否内容相等,===或者==只是用来比较是否是同一个对象,换句话说只有当连个对象的引用相同的时候才会返回true。这里我用了自己写的循环来判断是否两个数组呢容是否相等。在Stackflow上面也有人用更好的办法来实现比较两个数组,这里贴上传送门。
所以我们正确的代码应该如下:
//先写一个字符串的预处理函数
var preprocess = function(str){
str = str.replace(/\W+/g,""); //将所有非字符替换成空字符串,注意这里的W是大写
str = str.replace(/\_+/g,""); //将所有下划线替换成空字符
return str;
}; var finalcompare = function(array1,array2){
for(var i=0;i<array1.length;i++){
if(array1[i] != array2[i]){
return false;
break;
}
}
return true;
} //如果不区分大小写则用下面的compare1()函数,区分大小写的话就用下面的compare2()函数
var compare1 = function(str){
var newstr = preprocess(str);
var array1 = newstr.split(""); //将空字符串作为分隔符将字符串转换成数组
var array2 = newstr.split(""); //不使用数组引用类型之间的复制
array2 = array2.reverse();
return finalcompare(array1,array2);
};
var compare2 = function(str){
var newstr = preprocess(str);
var newstr = newstr.toLowerCase(); //将字符串全部转换成小写字母的形式
var array1 = newstr.split(""); //将空字符串作为分隔符将字符串转换成数组
var array2 = newstr.split(""); //不使用数组引用类型之间的复制
array2 = array2.reverse();
return finalcompare(array1,array2);
}; var str = "cat ac";
console.log(compare1(str));
console.log(compare2(str));
下面是在chrome的console里面的测试结果,亲测无误。

或者也可以将Array类型转化为String类型来比较。
var array = ["a","b","A"];
var compare = function(array){
var str1 = array.toString();
var str2 = array.reverse().toString();
if(str1 == str2){
return true;
}
return false;
};
compare(array);
我可能写的不是很简洁明了,我详细写出了我在写的时候踩着的坑,希望给看的人一定的警示作用吧,也希望我以后不会再犯吧。
可以参考下比较好的一篇的博文:点我传送
用javascript来判别回文数的更多相关文章
- javascript判断回文数
"回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...
- 【LC_Lesson3】---回文数的判别
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- 用JS实现回文数的精准辨别!!!
笔者最近在一边看<JS高级程序设计3>一边在FCC上找题目练习啊.那叫一个爽.这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章"引用类型"搞定,FCC便知 ...
- hdu1282回文数猜想
Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其 ...
- C语言 · 特殊回文数
问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 输入格式 输入一行,包含一个正整数n. 输 ...
- Java判断回文数算法简单实现
好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...
- luogu1207双重回文数[usaco1.2]Dual Palindromes
题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上 ...
- luogu10125回文数[noip1999 Day1 T1]
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
- 洛谷 P1015 回文数 Label:续命模拟QAQ
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
随机推荐
- Python Socket套接字编程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Codeforces 1097D. Makoto and a Blackboard
传送门 首先考虑如果 $n$ 只有一个质因数的情况,即 $n=p^t$ 那么显然可以 $dp$ ,设 $f[i][j]$ 表示第 $i$ 步,当前剩下 $p^j$ 的概率 那么转移很简单: $f[i] ...
- 牛客 203B tree(树形dp)
大意: 给定树, 对于每个节点, 求包含该节点的连通子集数. 显然有$dp[x]=\prod (dp[y]+1), ans[x]=(\frac{ans[fa[x]]}{dp[x]+1}+1)dp[x] ...
- R-corrplot相关性绘图,只有你想不到的
初步接触数据集,探索性分析后,经常需要做一个相关分析,得到各变量间的相关系数以及显著性水平. 本文介绍一下R-corrplot包进行相关可视化展示. 一 数据准备 载入所需的R包,利用公共数据集mtc ...
- 在windows部署service
首先,需要在环境变量的path中加入Install Util的路径: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 注意这里的Framework\v2.0 ...
- GSM AT指令 SIM900A TC35
http://download.csdn.net/download/zhangxuechao_/9911264 短信 TEXT格式 设置短消息中心号码: AT+CSCA="+86130101 ...
- 前端基础(四):BOM和DOM
前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- 原生js为页面添加爱心特效和判断手机端还是电脑端登录
<!-- 为页面添加爱心特效 --> <script type="text/javascript"> (function (window, document ...
- sql 分页查询 (每次6行 )
-- 对比 数据 是否 相同 select * from [dbo].[ProjecrInfo] where Project_state='已审核' -- 查询 已经 审核 有多少数据 -- 每次 ...
- Hadoop_15_MapRduce_案例1_Wordcount 单词统计
1.Wordcount示例编写: MapReduce采用”分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各 个节点的中间结果,得到最终结果.简单地说 ...