1

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

the swap function in the second while loop does not affect my return array for the generateArray method, even tho when printing to the console before and after the swap, the values have been perfectly swapped? see console.log 'before swap' and 'after swap'. Am I missing something?

console.log(generateArray1(4, 5))

expected result

[1, 8, 9, 16, 17
 2, 7, 10, 15, 18,
 3, 6, 11, 14, 19,
 4, 5, 12, 13, 20]

actual result

[1,  5,  9, 13, 17,  
 2,  6, 10, 14, 18,  
 3,  7, 11, 15, 19,  
 4,  8, 12, 16, 20]

console.log

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
1
  • 2
    There is something wrong with your condition to swap since, as shown in the console's log, you are swapping the same pair twice (where the second swap UNDOs the first). Commented May 23, 2020 at 8:07

1 Answer 1

0

After pointers pass each other break out of loop. You've already swapped all elements of a column once each pointer has gone over half of the rows.

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.