javascript - 我的交换函数对我的返回数组没有任何影响
问题描述
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
解决方案
指针相互传递后跳出循环。一旦每个指针超过一半的行,您就已经交换了列的所有元素。
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 or pointers have passed each other
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('')
);
推荐阅读
- matlab - 创建 1000x252 路径模拟
- python - 有没有办法修复pdfminer中的行对齐?
- c++ - Qml listview将新行添加到模型中的子向量
- python - 是否可以训练 spacy 来识别任何随机的组织名称
- django - Django 在电子邮件模板中请求用户名以及单击后如何将对象移动到接受或拒绝文件夹
- ios - 在 RxSwift 中处理绑定时如何不使观察者无效?
- spring - 启动后如何减少eureka CPU消耗?
- typo3 - 前端页面宽度pits_downloadcenter扩展返回错误
- powershell - 将数组动态分配给哈希中的键时出错
- spring - Thymeleaf 一次性向 URL 添加多个参数