首页 > 解决方案 > 我的交换函数对我的返回数组没有任何影响

问题描述

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

标签: javascriptarrays

解决方案


指针相互传递后跳出循环。一旦每个指针超过一半的行,您就已经交换了列的所有元素。

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('')
  );


推荐阅读