在技术访谈期间,我被要求实施一个基本的回文功能,在Javascript中排除非字母数字字符(例如,#34;一个人,一个计划,一个运河,巴拿马。")。我提出的代码基本上是这样的:
if(!empty($errors))
{
// if there are items in our errors array, return those errors
$data['input_valid'] = false;
$data['errors'] = $errors;
}
else
{
// If there are no errors process our form, then return a message
$data['input_valid'] = true;
$data['errors'] = $errors; // even though it is empty
// etc
我的采访者告诉我:
使用正则表达式是过度的,容易出错。
我在采访中接受了这一说法,但事后进行研究后,我还没有找到一个好的选择。这个问题的answer表明,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;
};
使用charCodeAt()
的效果更高,但我无法想象我会知道必要的字符代码来实现这样的解决方案。
我知道我的代码不一定是问题的最佳解决方案,但有没有人对我的采访者一直在寻找什么有任何想法?
答案 0 :(得分:2)
这里使用正则表达式是可以接受的,但是多次使用一个(每个字符的字符)是一种浪费。如果您使用一个,则使用它一次性删除字符串中的字符,并对结果执行常规的回文测试。
这是一种替代方法,可以在没有正则表达式的情况下进行删除,并且不需要了解字符代码。
它将字符串转换为数组,并使用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.'));
答案 1 :(得分:0)
只获取字母数字字符的老派方法是使用.charAt()
并比较字符串,您不必知道字符代码。而且由于你正在通过char处理字符串char,你几乎可以免费获得反向字符串,所以你可以知道字符串是否只是比较它们的回文:
function isPalindrome(inputStr) {
var i, char, str="", reverseStr="";
for (i=0;i<inputStr.length;i++) {
char=inputStr.charAt(i).toLowerCase();
if ((char>='0' && char<='9') || (char>='a' && char<='z')) {
str=str+char;
reverseStr=char+reverseStr;
}
}
console.log(str);
return (str==reverseStr);
};
console.log(isPalindrome('A man, a plan, a canal, Panama.'));
console.log(isPalindrome('Not really a palindrome'));
如果您想要或需要使用.charCodeAt()
四个原因,您只需使用获取'0'
- '9'
和'a'
- 'z'
的代码还.charCodeAt()
:
var tempStr='09az';
var code0=tempStr.charCodeAt(0), code9=tempStr.charCodeAt(1),
codeA=tempStr.charCodeAt(2), codeZ=tempStr.charCodeAt(3);
console.log(code0,code9,codeA,codeZ);