什么是回文数?通俗的说就是正着读和倒着读都一样的字符串(即使是数字也是可以看成字符串的)。

  所以下面回文数都是用字符串来表示的,即判断回文数就是对字符串的判断。

  举几个回文数的例子:

    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来判别回文数的更多相关文章

  1. javascript判断回文数

    "回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...

  2. 【LC_Lesson3】---回文数的判别

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

  3. 用JS实现回文数的精准辨别!!!

    笔者最近在一边看<JS高级程序设计3>一边在FCC上找题目练习啊.那叫一个爽.这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章"引用类型"搞定,FCC便知 ...

  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. 如何设置输入IP地址就直接访问到某一个网站

    如何设置输入IP地址就直接访问到某一个网站 1).在IIS中添加好站点后,在网站绑定中设置明确的IP地址,如下图: 2).修改Default WebSite的端口,或者是把Default WebSit ...

  2. Spring Boot(一) 初步理解Spring Boot

    一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...

  3. 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式:   1. 基于源码的基础上构建出来的   2. 使用WAR overlay的方式来安装 官方推荐使用第二种,配置管理方便,以后升级也容易.本文就是使用第 ...

  4. 用最简单的代码写出banner图轮播效果

    以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html

  5. PHP点击按钮拷贝

    一.PHP中点击按钮拷贝文本,我一个页面有多个按钮,相同颜色的标注代表了相同的列或ID 二.这是HTML代码 <tr> <td>直播流地址(延时60秒)</td> ...

  6. Python3简易接口自动化测试框架设计与实现(中)

    目录 7.Excel数据读取 7.1.读取配置文件 7.1.编写Excel操作类 8.用例组装 9.用例运行结果校验 10.运行用例 11 .小结 上一篇:Python3简易接口自动化测试框架设计与实 ...

  7. Dedecms限制栏目列表生成的最大页数

    首先,我们要登陆DEDECMS后台 >> 系统 >> 站点设置 的同条栏目上,添加一个新的变量,变量名称:cfg_listmaxpage,变量说明:栏目生成列表最大页数,变量值 ...

  8. 三次样条插值 cubic spline interpolation

    什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...

  9. 【异常】 Ensure that config phoenix.schema.isNamespaceMappingEnabled is consistent on client and server.

    1 详细异常 ror: ERROR 726 (43M10): Inconsistent namespace mapping properties. Ensure that config phoenix ...

  10. win10下 switchhost权限修改问题

    switchhost提示没有切换权限:C:\WINDOWS\system32\drivers\etc\host 文件无法修改   1.找到host文件 C:\Windows\System32\driv ...