如何不使用正则表达式实现字符串的N字符交替掩码替换
实现任意N值的字符串交替组替换(无正则)
核心思路
要实现任意N值的分组交替保留/替换,最高效的方式是用数组操作替代字符串拼接(JS字符串是不可变类型,频繁拼接会产生大量临时对象,损耗性能),通过一次遍历判断每个字符所在的组类型,直接修改数组元素即可。
实现代码
function processString(str, N) { // 将字符串转为数组,方便直接修改单个字符 const charArray = str.split(''); for (let i = 0; i < charArray.length; i++) { // 计算当前字符所属的组索引(从0开始计数) const groupNum = Math.floor(i / N); // 奇数索引的组(第2、4、...组)替换为*,偶数索引组保留原字符 if (groupNum % 2 === 1) { charArray[i] = '*'; } } return charArray.join(''); } // 测试示例 const testStr = "9876543210"; console.log(processString(testStr, 1)); // 输出:9*7*5*3*1* console.log(processString(testStr, 2)); // 输出:98**54**10 console.log(processString(testStr, 3)); // 输出:987***321*
为什么这是最优解?
- 时间复杂度O(n):仅需遍历字符串一次,每个字符的处理都是O(1)操作,是线性时间复杂度,无法再优化(必须接触每个字符一次)。
- 空间复杂度O(n):用数组存储字符,与原字符串长度一致,属于必要开销,避免了字符串拼接带来的额外内存浪费。
- 兼容性强:自动处理字符串长度不是N整数倍的边界情况(比如示例中N=3时最后一组仅1个字符,仍按规则保留)。
对比原有N=1的实现
原有代码通过substring反复拼接字符串,每次循环都会生成新的字符串对象,对于长字符串性能极差。而数组操作直接修改对应位置的元素,避免了不必要的内存开销和字符串拷贝。
内容的提问来源于stack exchange,提问作者SKR Sama
相关产品推荐
相关产品推荐

