gpt4 book ai didi

javascript - 是否有比 Javascript 中的正则表达式更小的内存密集型方法来排除字母数字字符?

转载 作者:行者123 更新时间:2023-11-29 11:01:37 25 4
gpt4 key购买 nike

在一次技术面试中,我被要求实现一个基本的回文函数,用于排除 Javascript 中的非字母数字字符(例如“一个人、一个计划、一条运河、巴拿马”)。我想出的代码基本上是这样的:

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;
};

我的面试官接着告诉我:

use of regex is overkill and prone to error.

我在面试时接受了这个说法,但后来研究了一下,我一直没能找到一个好的替代方案。这answer对一个不同的问题表明使用 charCodeAt() 性能更高,但我无法想象我会被期望知道必要的字符代码来实现这样的解决方案。

我知道我的代码不一定是问题的最佳解决方案,但是有人知道我的面试官可能一直在寻找什么吗?

最佳答案

在这里使用正则表达式是可以接受的,但是多次使用一个正则表达式(每个字符一个字符)是一种浪费。如果使用一个,则使用它一次性从字符串中删除字符,并对结果执行常规回文测试。

这里有一个替代方案,可以在不使用正则表达式且不了解字符代码的情况下进行删除。

它将字符串转换为数组,并对其应用过滤器,使用允许字符的 Set 作为 this 对象:

function isPalindrome(str) {
str = [...str.toLowerCase()].filter(function (c) {
return this.has(c);
}, new Set('abcdefghijklmnopqrstuvwxyz0123456789'));
for (var i = 0, j = str.length - 1; i < j; i++, j--) {
if (str[i] !== str[j]) return false;
}
return true;
};

console.log(isPalindrome('A man, a plan, a canal, Panama.'));

关于javascript - 是否有比 Javascript 中的正则表达式更小的内存密集型方法来排除字母数字字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46085801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com