求助:无需内置函数实现JavaScript按单词反转字符串的方案
解决字符串中每个单词反转的问题(无内置函数)
嘿,我来帮你搞定这个问题!你想要实现的是把字符串里的每个单词单独反转,最终得到CBA FED IHG LKJ对吧?先聊聊你现有代码里的几个关键问题:
- 字符串不可变性:在JavaScript里,字符串是不能直接通过下标修改的,你给
str[k]赋值的操作根本不会生效,必须先把字符串转换成数组来操作。 - 循环逻辑错误:内层循环的条件
k < j-1完全不对,k初始值是j(空格的位置),j肯定比j-1大,这个循环根本不会执行,自然没法反转单词。 - 遗漏最后一个单词:你的代码只在遇到空格时处理前面的单词,但最后一个单词后面没有空格,导致它永远不会被反转。
正确的实现思路
我们手动实现整个流程,完全不用内置的split()、reverse()这类函数:
- 把原字符串转换成字符数组,方便修改
- 遍历数组,记录每个单词的起始索引
- 当遇到空格或者遍历到数组末尾时,反转从起始索引到当前位置前一个的字符区间
- 最后把反转后的字符数组转回字符串
完整代码实现
var str = 'ABC DEF GHI JKL'; // 转成字符数组,因为字符串不可变 var charArr = []; for (var i = 0; i < str.length; i++) { charArr.push(str[i]); } var startIndex = 0; // 记录每个单词的起始位置 for (var i = 0; i <= charArr.length; i++) { // 遇到空格或者到达数组末尾时,反转当前单词 if (i === charArr.length || charArr[i] === ' ') { var left = startIndex; var right = i - 1; // 单词的最后一个字符索引 // 手动反转单词:交换左右指针的字符,直到中间 while (left < right) { var temp = charArr[left]; charArr[left] = charArr[right]; charArr[right] = temp; left++; right--; } startIndex = i + 1; // 更新下一个单词的起始位置 } } // 把数组转回字符串 var result = ''; for (var i = 0; i < charArr.length; i++) { result += charArr[i]; } document.write(result); // 输出:CBA FED IHG LKJ
代码解释
- 第一步把字符串转成数组:因为JS字符串不可变,必须用数组来修改字符位置
- 用
startIndex跟踪每个单词的开头,遇到空格或末尾时,就反转[startIndex, i-1]这个区间的字符 - 手动反转单词:用双指针法,左指针从单词开头,右指针从单词结尾,交换两者的字符,直到指针相遇,这样就完成了单词的反转
- 最后把数组拼接回字符串,得到最终结果
内容的提问来源于stack exchange,提问作者aaqib90
相关产品推荐
相关产品推荐

