我对编程非常陌生,我正在尝试解决一个练习,根据组成字符是否出现两次或多次来对字符串(在本例中为单个单词)进行编码。仅出现一次的字符会编码为“■”,编码两次或多次的字符会编码为“X”。
示例:输入=“hippodrome”::输出=“■■XXX■■X■■”
我设法使用嵌套循环和key:value
以一种非常复杂的方式解决了这个问题。对象存储 character:occurrences
,但我正在尝试使用动态创建的正则表达式重构解决方案以提高效率,但我认为我不理解正则表达式表示法。
function encodeDupes(word) {
let encoded = "";
for (let char of word) {
let regex = new RegExp(char + "{2,}","ig"); // create a regex to see if "char" occurs 2 or more times
regex.test(word) ? encoded += "X" : encoded += "■"; // check this char against rest of word, push appropriately
}
return encoded;
}
它适用于更简单的门,例如 char < "m" ? do X : do Y
,我以为我理解了这个答案 here ( {n,}
= 至少 n
出现),但我还不够新,我仍然不确定这是我的正则表达式还是我的逻辑。
谢谢!
最佳答案
I'm very new to programming, ..., I am trying to refactor the solution to be more efficient using a dynamically created RegExp...
这有点像第 22 条陷阱,因为正则表达式为了方便而牺牲了效率。为了使正则表达式“引擎”运行,必须建立语法,并且词法分析器、解析器和求值器将基于字符串的输入表达式转换为程序输出。使用正则表达式实现特定程序(有时)很方便,但几乎不可能击败不被正则表达式引擎减慢速度的基本算法。
I managed to solve it in a very convoluted way using nested loops and a
key:value
object storingcharacter:occurrences
...
确实很复杂,但遗憾的是,即使是“专家”程序员也会做这样的事情。当我们意识到不需要计算每个字母时,一种有效的算法就会出现。相反,我们只需要知道某个字母是否出现多次。使用两个Set对象,一次
和更多
,我们可以确定答案,而不需要为每个字母分配计数器内存!由于 O(1) 恒定时间查找,集合速度快如闪电 -
function encodeDupes(word)
{ const once = new Set
const more = new Set
for (const c of word)
if (more.has(c))
continue
else if (once.has(c))
(once.delete(c), more.add(c))
else
once.add(c)
return Array
.from(word, c => more.has(c) ? "X" : "■")
.join("")
}
console.log(encodeDupes("hippodrome"))
输出
■■XXX■■X■■
关于JavaScript - 重复字符的动态正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63947761/