用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进制数 ...
随机推荐
- 消息服务百科全书——Kafka基本原理介绍
架构 1.1 总体架构 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理. 为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息. 一 ...
- WIndows系统BAT文件语法和技巧 原文的地址(http://www.jb51.net/article/5828.htm)
批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本 ...
- Spring Boot Redis 集成 Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'
一.原因:redis集群环境没有开启Keyspace notifications 二.解决办法 @Configuration public class HttpSessionConfig { /** ...
- Css文字在div中自动换行
Css文字在div中自动换行 word-break:break-all; 文字在div中字段换行
- SIP 3pcc
3PCC全称Third Party Call Control,中文即第三方电话呼叫控制,指的是由第三方控制者在另外两者之间建立一个会话,由控制者负责会话双方的媒体协商.3PCC是一种非常灵活的会话控制 ...
- beego学习笔记一:创建第一个beego Web项目 转
前提工作 环境搭建,可以参考如下两篇教程:搭建Go语言环境1搭建Go语言环境2 安装beego beego 的安装是典型的 Go 安装包的形式: go get github.com/astaxie/b ...
- Maven 依赖的作用域
Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile,项目中经常傻傻的分不清,直接默认了 ...
- kubernetes之node隔离与恢复
需求: 在硬件升级, 硬件维护等情况下, 我们需要将某些node隔离, kubectl cordon <node_name> #禁止pod调度到该节点上, 在其上运行的pod并不会自动停止 ...
- 13_Hive优化
Hive优化 要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著 ...
- 深度排序模型概述(二)PNN/NFM/AFM
在CTR预估中,为了解决稀疏特征的问题,学者们提出了FM模型来建模特征之间的交互关系.但是FM模型只能表达特征之间两两组合之间的关系,无法建模两个特征之间深层次的关系或者说多个特征之间的交互关系,因此 ...