【发布时间】:2020-05-23 07:46:48
【问题描述】:
const generateArray = (row, col) => {
let totalCells = row * col
const resultArray = [] // sorted
let subArray = []
let counter = 1
let trackRow = 1
let i = 0
while (i <= totalCells) {
if (counter === 1) subArray.push(trackRow)
else {
subArray.push(subArray[subArray.length - 1] + row)
}
if (subArray.length === col) {
resultArray.push(...subArray)
subArray = []
counter = 1
trackRow++
} else counter++
if (i === totalCells) { // perform swap if necessary
let lastIdx = resultArray.length - 1
let pointer1 = lastIdx
let count = 0
let pointer2 = col - 1
while(pointer1 >= 0) {
count++
if (count > col) {
pointer2 = lastIdx - pointer1 + col - 1
count = 1
}
if (pointer2 < 0 || pointer1 === pointer2 ) break // // pointers overlap and pointer on same row
if (count % 2 === 0) {
console.log('before swap', resultArray[pointer1], resultArray[pointer2]) // swap 16 13
swap(pointer2, pointer1, resultArray)
console.log('after swap', resultArray[pointer1], resultArray[pointer2]) // after swap 13 16
}
pointer2--
pointer1--
}
}
i++
}
return resultArray
}
function swap (a, b, array) {
[array[a], array[b]] = [array[b], array[a]]
}
console.log(
generateArray(4,5).map((x,i)=>`${x}`.padStart(2)+(i!=0&&i%5==4?'\n':',')).join('')
);
第二个 while 循环中的交换函数不会影响 generateArray 方法的返回数组,即使在交换之前和之后打印到控制台时,值已被完美交换?参见console.log“交换前”和“交换后”。我错过了什么吗?
console.log(generateArray1(4, 5))
预期结果
[1, 8, 9, 16, 17
2, 7, 10, 15, 18,
3, 6, 11, 14, 19,
4, 5, 12, 13, 20]
实际结果
[1, 5, 9, 13, 17,
2, 6, 10, 14, 18,
3, 7, 11, 15, 19,
4, 8, 12, 16, 20]
控制台日志
before swap 16 13,
after swap 13 16,
before swap 8 5,
after swap 5 8,
before swap 15 14,
after swap 14 15,
before swap 7 6,
after swap 6 7,
before swap 15 14
after swap 14 15,
before swap 7 6,
after swap 6 7,
before swap 16 13,
after swap 13 16,
before swap 8 5,
after swap 5 8
【问题讨论】:
-
您的交换条件有问题,因为如控制台日志所示,您将同一对交换两次(第二次交换 UNDO 撤消第一次)。
标签: javascript arrays