好的,所以我正在尝试改进我的JS,并且遇到了流行的Palindrome Checker练习。这次,freeCodeCamp的此解决方案应该能很好地执行,但我无法理解它的几个方面。
/this solution performs at minimum 7x better, at maximum infinitely better.
//read the explanation for the reason why. I just failed this in an interview.
function palindrome(str) {
//assign a front and a back pointer
let front = 0
let back = str.length - 1
//back and front pointers won't always meet in the middle, so use (back > front)
while (back > front) {
//increments front pointer if current character doesn't meet criteria
if ( str[front].match(/[\W_]/) ) {
front++
continue
}
//decrements back pointer if current character doesn't meet criteria
if ( str[back].match(/[\W_]/) ) {
back--
continue
}
//finally does the comparison on the current character
if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false
front++
back--
}
//if the whole string has been compared without returning false, it's a palindrome!
return true
}
现在,我对此代码有几个疑问:
1-将str的长度减少1的意义是什么?我已经在多个回文检查器中看到了这一点,但仍然无法绕开它。
2- .match方法是否意味着“如果参数包含这些字符,则返回true”?
3-为什么“ / [\ W _] /”等于“所有字符”?
4-在前后加1减1的意义是什么?尤其是在函数末尾。
谢谢您,如果这是一个愚蠢的问题,我真的很想了解这里的逻辑。
答案 0 :(得分:1)
要回答第一个问题,“后退”是一个指向字符串后部的指针。其值为str.length - 1
的原因是,尽管索引从0开始,str.length
将给出字符串中属性的数量。因此,您需要从长度中减去1以获得最后一个属性的索引。
要回答您的最后一个问题,分别在正面/背面加1 /减去1就是使要测试的属性彼此递增。例如,如果字符串是“ abba”,则在比较第一个字母和最后一个字母之后,它将增加计数器,以便将第一个b(新的“ front”)与第二个b(新的“ back”)进行比较。 ')
答案 1 :(得分:1)
这是同时查看字符串的开头和字符串的结尾并进行比较。在每个循环中,它都会使前进和后退:
loop 1
amanaplanacanalpanama
| |
front back
front === back? if not it iss not a palindrome
loop 2 (front+1 & back -1)
amanaplanacanalpanama
| |
front back
front === back?
etc.
如果继续返回true,则说明您有回文。
您可能会遇到的问题是回文,例如:
夫人,我是亚当
'
和空格将其弄乱了,但大多数人仍将其称为回文。这就是为什么您有这样的行:
str[back].match(/[\W_]/)
.match(/[\W_]/)
测试字母是否是“'单词”之类的“非单词”字母,甚至是一个空格,然后将前向指针向后移动经过它。这使测试不必关心空格和非单词字符。