JavaScript遍历不同长度数组按条件填充第三个数组实现字符串排序
问题描述
- 此前通过嵌套循环实现过同类功能,但本次处理两个独立数组的索引匹配逻辑时频繁出错,该问题是阻碍功能完成的核心难点。
- 待实现需求:对同时包含字母和数字的字符串做排序,要求字母按逆字母表顺序排序,数字保留在原始索引位置不变。
- 现有实现无法正确组装
sortString数组,不能将字母和数字重新拼接为目标字符串,需要修正代码达成效果,例如调用reverse("ab89c")时应返回"cb89a"。
原有问题代码如下:
function reverse(str) { // split the str into an array const arr = [...str] // converts each element in arr to a number, letters are string 'NaN' const numArray = arr.map(x=> Number(x)).map(x=> x >= 0 ? x : String(x)) // array of the sorted letters const letters = arr.filter(x=> !/[0-9]/g.test(x)).reverse() // initiate empty array to hold the combined numbers and letters let sortString = [] // Use for loop to cycle through and replace elements that are 'NaN' with letters from the letter array. All pushed to sortString. for (let i=0; i<arr.length; i++) { sortString.push(numArray[i] === 'NaN' ? letters[0] : numArray[i]) } return sortString } reverse("ab89c") // output should be "cb89a"
代码问题点
- 字母排序逻辑错误:直接对原顺序提取的字母数组调用
reverse(),仅反转字母在原字符串中的出现顺序,并非按逆字母表规则排序,测试用例巧合通过但无法覆盖其他输入场景。 - 字母取值逻辑错误:遍历过程中遇到字母位置时固定取
letters[0],没有移动取值索引,会导致所有字母位置被填入同一个字符。 - 返回值不符合要求:函数最终返回数组,没有拼接为字符串结果。
- 数字判断逻辑冗余:通过
Number()转值后对比字符串'NaN'的写法绕路,还存在边界判断异常风险。
修正后实现
实现思路:
- 提取字符串中所有字母,单独做逆字母表排序
- 遍历原字符串,数字直接保留在原位置,字母按顺序从排好序的字母列表中依次取值填充
- 将组装完成的字符数组拼接为字符串返回
function reverse(str) { const charArr = [...str] // 提取所有字母,按逆字母表排序 const sortedLetters = charArr .filter(char => !/[0-9]/.test(char)) .sort() .reverse() const result = [] // 标记当前待取的排序后字母的索引 let letterPointer = 0 for (const char of charArr) { if (/[0-9]/.test(char)) { // 数字直接保留 result.push(char) } else { // 字母按顺序取排好序的值,指针后移 result.push(sortedLetters[letterPointer]) letterPointer++ } } // 拼接为字符串返回 return result.join('') } // 测试 console.log(reverse("ab89c")) // 输出: cb89a
该实现逻辑清晰,时间复杂度由排序步骤决定,为O(n log n),可满足常规使用场景。
内容的提问来源于stack exchange,提问作者Nick Huemmer
相关产品推荐
相关产品推荐

