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

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

  举几个回文数的例子:

    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. Antd中,Form和Select联合使用,导致placeholder不生效分析

    在使用antd的form组件时候,需要对Select组件进行语体示,placeholder,但是写的值并不生效 效果如上,但是现实的时候不生效,经检查发现,组件需要传递的是undefined,如果传入 ...

  2. 怎样理解 display:none 和 visibility:hidden

    1. display: none会使元素节点 "消失" , 就像 死亡后灰飞烟灭了. 它是不占位置的. 2. visibility: hidden会使元素节点 "隐藏&q ...

  3. Java Web-JSP学习

    Java Web-JSP学习 概念 Java Server Pages:Java服务器端页面.可以在其中直接定义HTML标签,也可以在其中直接定义java代码. 关于JSP和JAVASCRIPT的区别 ...

  4. Arcgis for js加载百度地图

    看转:https://blog.csdn.net/qq_41046162/article/details/80248281 通过学习了一段时间的arcgis for js,让我来讲一下如何在arcgi ...

  5. nuxt项目打包上线之二

    之前写过一篇nuxt打包上线的文章,请看这里:https://www.cnblogs.com/daisygogogo/p/11218809.html 上一篇文章的部署流程有点不好的地方,就是它适用于只 ...

  6. selenium 12306模拟登陆

    代码应用场景 :基于第三方打码网站模拟登陆12306 验证码识别 基于第三方平台超级鹰识别 超级鹰官网:http://www.chaojiying.com/user/ 超级鹰使用流程: 注册 登陆(用 ...

  7. ::selection伪元素改变文本选中颜色

    在看张鑫旭大神的文章,刚刚发现了这个,感觉应该后面有用,先存起来. 效果如下: 代码如下: <!DOCTYPE html> <html> <head> <me ...

  8. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  9. 安全开发Java动态代理

    关于安全开发的一些思考 之前面试某宝的时候,某人问过我,如果解决开发不懂安全的问题,就比如说SSRF,XEE这样的漏洞,如果一旦发生,应该如果立刻去响应,并帮助开发人员修复漏洞,难道写一个jar包?然 ...

  10. Django—admin系统:admin的使用及源码剖析

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...