javascript - 有人可以解释一下这个回文解决方案吗?
问题描述
好的,所以我正在尝试改进我的 JS,并且遇到了流行的回文检查器练习。这次,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有什么意义?尤其是在函数的最后。
谢谢,如果这是一个愚蠢的问题,我很抱歉,我真的很想理解这里的逻辑。
解决方案
为了回答你的第一个问题,'back' 是一个指向字符串后面的指针。它的值是str.length - 1
因为str.length
会给出字符串中属性的数量,尽管索引从 0 开始。因此,您需要从长度中减去 1 以获得最后一个属性的索引。
要回答您的最后一个问题,分别从正面/背面加 1 / 减 1 是为了增加正在测试的属性。例如,如果字符串是“abba”,在比较第一个字母和最后一个字母后,它将递增计数器,以便将第一个 b(新的 'front')与第二个 b(新的 'back ')
推荐阅读
- flutter - Flutter 如何在java中将容器更改为面板
- mysql - 用redis加入mysql结果
- go - 使用 Go lang gopdf 在 PDF 上显示正确的马拉雅拉姆语文本
- python - 如何检查字符串是否是python中的可调用名称?
- javascript - 为什么列表上的 push/unshift 函数会影响 Javascript 中分配给该列表的其他列表?
- google-sheets - Google表格可以根据不同的数字从表格中提取数字吗
- c# - 为什么 .ToString() 方法会破坏我的代码?
- c# - 将 Unsafe 指针转换为 Span
- node.js - 如何防止 Apache 代理服务器和 nuxt 应用程序的远程服务器读取错误
- javascript - 如何使用 javascript 设置 DIV 可见 onload