是否有比Javascript中的正则表达式更少的内存密集型排除字母数字字符的方法?
在一次技术采访中,我被要求实现一个基本的回文函数,该函数排除Javascript中的非字母数字字符(例如,“一个人,一个计划,一条运河,巴拿马”)。我提出的代码基本上如下所示:是否有比Javascript中的正则表达式更少的内存密集型排除字母数字字符的方法?,javascript,regex,validation,Javascript,Regex,Validation,在一次技术采访中,我被要求实现一个基本的回文函数,该函数排除Javascript中的非字母数字字符(例如,“一个人,一个计划,一条运河,巴拿马”)。我提出的代码基本上如下所示: function skipNonAlphanumeric(str,i,j) { var regex = /[^a-zA-Z0-9]/; if(regex.test(str[i])) { i++; return skipNonAlphanumeric(str,i,j); }; if(rege
function skipNonAlphanumeric(str,i,j) {
var regex = /[^a-zA-Z0-9]/;
if(regex.test(str[i])) {
i++;
return skipNonAlphanumeric(str,i,j);
};
if(regex.test(str[j])) {
j--;
return skipNonAlphanumeric(str,i,j);
};
return {i: i, j: j};
};
function isPalindrome(str) {
var j = str.length - 1;
var i = 0;
var indices, ci, cj;
while(i < j) {
indices = skipNonAlphanumeric(str,i,j);
i = indices.i;
j = indices.j;
ci = str[i].toLowerCase();
cj = str[j].toLowerCase();
if(ci !== cj) {
return false;
};
j--;
i++;
};
return true;
};
函数skipNonAlphanumeric(str,i,j){
var regex=/[^a-zA-Z0-9]/;
if(正则表达式测试(str[i])){
i++;
返回skipNonAlphanumeric(str,i,j);
};
if(正则表达式测试(str[j])){
j--;
返回skipNonAlphanumeric(str,i,j);
};
返回{i:i,j:j};
};
函数isAlindrome(str){
var j=str.length-1;
var i=0;
var指数,ci,cj;
而(icharCodeAt()
更有效,但我无法想象我会被期望知道实现这样一个解决方案所需的字符代码
我知道我的代码不一定是解决这个问题的最佳方案,但是有没有人知道我的面试官可能一直在寻找什么呢?在这里使用正则表达式是可以接受的,但是多次使用一个(每个字符)是一种浪费。如果使用一个,则使用它一次性删除字符串中的字符,并对结果执行常规回文测试 这里有一种替代方法,可以在不使用正则表达式和不了解字符代码的情况下进行删除 它将字符串转换为数组,并对其应用过滤器,使用允许的字符集作为
此
对象:
函数isAlindrome(str){
str=[…str.toLowerCase()]过滤器(函数(c){
归还此。has(c);
},新的一套('abcdefghijklmnopqrstuvwxyz0123456789');
对于(变量i=0,j=str.length-1;i console.log(isPalindrome(“一个人,一个计划,一条运河,巴拿马”)
传统的只获取字母数字字符的方法是使用.charAt()
比较字符串,您不必知道字符代码。由于您正在逐字符处理字符串,因此您几乎可以免费获得反向字符串,因此您可以通过比较它们来知道字符串是否为回文:
函数isAlindrome(inputStr){
变量i,char,str=“”,reverseStr=“”;
对于(i=0;i='0'&&char='a'&&charNo,使用正则表达式排除字母数字字符没有什么错。但是代码中有很多其他东西肯定是过度使用了,所以您实际上并不关心解决方案的内存密集程度,这与您在标题中所问的相反?什么是回文?给您,它是还是它不会/^[a-zA-Z0-9]*$/
而且,你可以很容易地用任何东西替换/[^a-zA-Z0-9]+//g
使用正则表达式是一种过火和容易出错的行为
永远不要对一个说这种话的人起作用!!@sln好吧,如果你对RE的了解很少,那么像这样的小表达式很容易理解(大多数程序员没有),但我似乎有多行的怪物需要罗塞塔石来破译它们……我想如果你使用了Array.from
而不是扩展语法,以及一个额外的变量allowedChars
而不是这个
技巧,那么代码将是非常自我解释的常量[code0,code9,codeA,codeZ]=Array.from('09az',c=>c.charCodeAt(0));
:-)@Bergi更好,但这太花哨了,不像是老派:-)