这是一个javascript问题。我在freecodecamp上解决了回答问题。让我在这里写完整代码:
function palindrome(str) {
var normalizedStr = str.replace(/[\W_]/g, '').toLowerCase();
var reverseStr = normalizedStr.split('').reverse().join('');
return normalizedStr === reverseStr;
}
答案 0 :(得分:7)
\ W 元字符用于查找非单词字符。单词字符是来自a-z,A-Z,0-9,的字符,包括下划线字符。这意味着如果您使用[\ W]而不是[\ W _]
var normalizedStr = str.replace(/[\W]/g, '').toLowerCase();
您的normalizedStr在替换后仍然包含下划线。
由于此挑战需要删除所有非字母数字字符(标点符号,空格和符号),因此对于包含“_”的任何已处理字符串,它将返回不需要的结果:
回文(“_ eye”) - 应该返回true,但它将是假的;
回文(“0_0(:/ - \ :) 0-0”) - 应该返回true,但将为false;
此外,不是将字符串转换为数组,而是将其反转并在比较之前将其转换回字符串,更好地使用 for循环来比较数组以获得更好的性能(特别是如果字符串是更大的):
function palindrome(str) {
var clearString = str.toLowerCase().replace(/[^0-9a-z]/gi, '').split('');
for (var i = 0; i < clearString.length/2; i++) {
if (clearString[i] !== clearString[clearString.length -1 -i]) {
return false;
}
}
return true;
}
请注意, false 语句应首先且 true 语句必须
基准代码段在这里:
const stringLength = 100000; // < < ADJUST THE STRING LENGTH HERE
const string = superString(stringLength);
console.log(`Random string length: ${string.length} symbols`);
benchMark(arraySplitReverseJoinMethod);
benchMark(forLoopComparisonMethod);
function arraySplitReverseJoinMethod(str) {
return str == str.split('').reverse().join('');
}
function forLoopComparisonMethod(str) {
let string = str.split('');
for (var i = 0; i < string.length/2; i++) {
if (string[i] !== string[string.length -1 -i]) {
return false;
}
}
return true;
}
function benchMark(func) {
const start = +new Date();
func(string);
const end = +new Date();
const total = end - start;
console.log(`${func.name}: ${total} ms`);
return `${func.name}: ${total} ms`;
}
function superString(n) {
let superString = '';
for (let i = 0; i < n; i++) {
const randomString = Math.random().toString(36).substring(2, 12);
superString = superString.concat(randomString);
}
return superString;
}
答案 1 :(得分:2)
\W
匹配任何非单词字符[^a-zA-Z0-9_]
_
文字_
所以这个正则表达式只会在你的字符串中保留字母和数字