循环移位数组排序问题:如何让循环在areEqual返回false后继续执行?
问题1的解决方法
你现在的核心问题是循环逻辑错误:只要碰到一个不符合条件的移位数组就直接返回-1,导致后续的移位数组根本没机会被检查。正确的逻辑应该是遍历所有移位数组,记录符合条件的t,只有当所有数组都检查完仍无符合条件的,才返回-1。
另外还要补两个细节:
- 原代码中的
i没有用let声明,会变成全局变量,必须补上; - 原
shiftedArray函数没有包含「移位0次」的情况(也就是原数组本身),如果原数组已经是有序的,会错误返回-1,需要额外添加检查。
修改后的solution函数如下:
function solution(elements) { // 先默认返回-1,表示未找到符合条件的t let numOfShifts = -1; const shifts = shiftedArray(elements); // 遍历所有移位后的数组 for (let i = 0; i < shifts.length; i++) { if (areEqual(shifts[i])) { // 注意:shiftedArray生成的是移位1~n-1次的数组,i从0开始,所以实际移位次数是i+1 numOfShifts = i + 1; // 如果只需要找第一个符合条件的t,这里可以直接return,不用继续遍历 // return numOfShifts; } } // 额外检查原数组本身是否有序(移位0次的情况) if (areEqual(elements)) { return 0; } return numOfShifts; }
疑问2的正确实现
首先要明确:arr.push(arr.pop())这个写法本身就有问题——pop()取出数组最后一个元素,push()又把它加到数组末尾,等于什么都没做,而且push()方法返回的是数组修改后的长度,不是数组本身,还会直接修改原数组。
如果要实现不修改原数组的循环移位,正确的写法分两种情况:
1. 循环右移一次(把最后一个元素移到最前面)
function shiftRightOnce(arr) { if (arr.length === 0) return []; // 先复制原数组,避免修改原数组 const newArr = [...arr]; const lastElement = newArr.pop(); newArr.unshift(lastElement); return newArr; }
2. 循环左移一次(把第一个元素移到最后)
function shiftLeftOnce(arr) { if (arr.length === 0) return []; const newArr = [...arr]; const firstElement = newArr.shift(); newArr.push(firstElement); return newArr; }
如果需要生成所有移位次数的数组,可以用上面的函数循环生成:
function generateAllShifts(arr) { const shifts = []; let currentArr = [...arr]; // 生成移位1~n-1次的数组 for (let i = 1; i < arr.length; i++) { currentArr = shiftRightOnce(currentArr); shifts.push([...currentArr]); } return shifts; }
内容的提问来源于stack exchange,提问作者DonnyRodriguez
相关产品推荐
相关产品推荐

