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

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

  举几个回文数的例子:

    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. 测试工作小工具~总结&下载连接

    1.Gif录制小工具(动图提单 ≖ᴗ≖) 地址:https://licecap.en.softonic.com/download

  2. Go的包管理工具(一)

    在前面转载了系列文章:Golang 需要避免踩的 50 个坑,总得来说阅读量都挺大.今天这篇文章,咱们一起聊聊Go的依赖包管理工具. 背景 每一门语言都有其依赖的生态,当我们使用Java语言的时候,使 ...

  3. hdu 6082 2017百度之星资格赛

    #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...

  4. Java浅拷贝与深拷贝(思维导图)

    图1 拷贝思维导图(点击查看图片) 1,拷贝 有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号! 相同可能表示这么几个意思:① ...

  5. Web API 实体对象Get请求参数为null

    实体对象前加上 [FromUri] 特性

  6. Nginx笔记一

      nginx: 为什么选择nginx: nginx是一个高性能的web和反向代理服务器. 作为web服务器:使用更少的资源,支持更多的并发连接,更高的效率,能够支持高达5w个并发连接数的相应, 作为 ...

  7. vue+element-ui 项目中实现复制文字链接功能

    需求: 点击复制按钮,复制一个链接 在GitHub上找到一个clipboard组件,功能比较齐全 使用方法:   安装 npm i clipboard --save HTML <template ...

  8. Browser Security-超文本标记语言(HTML)

    Browser Security-超文本标记语言(HTML) 瞌睡龙 · 2013/06/19 18:55 重要的4个规则: 1 &符号不应该出现在HTML的大部分节点中. 2 尖括号< ...

  9. Scala语言面向对象

    apply1. 面向对象的基本概念: 把数据及对数据的操作方法放在一起,作为一个相互依存的整体-----对象,面向对象的三大特征:封装.多态.继承 2. scala类的定义 · class Emplo ...

  10. Mysql(八):ORM框架SQLAlchemy

    一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...