# AI solution for JavaScript Coding Question on BFE.dev

25. Reorder array with new indexes

One possible solution to reorder the array with new indexes is to iterate over the array and for each element, swap it with the element at the corresponding new index. We can mark the indices that have been swapped by negating their values, so that we don't double-swap them.

Here's how the code can look like:

`function reorderArrayWithNewIndexes(A, B) { // Mark the indices that have been swapped by negating their values for (let i = 0; i < A.length; i++) { let j = B[i]; while (j >= 0) { let temp = A[i]; A[i] = A[j]; A[j] = temp; B[i] = -1 * (j + 1); // mark as swapped j = B[j]; // follow the chain of swaps } } // Fix the sign of the swapped indices for (let i = 0; i < B.length; i++) { B[i] = -1 * (B[i] + 1); }}`

This function modifies the `A`

array in place, and assumes that `B`

contains valid indices for all elements of `A`

. The first loop iterates over the array and swaps each element with its corresponding new index, following a chain of swaps if necessary. The second loop fixes the sign of the swapped indices, so that `B`

corresponds to the new ordering of `A`

.

To solve the follow-up question with `O(1)`

space, we can use a similar algorithm but instead of negating the indices, we encode the original and new values in a single integer. Since the values in `A`

are in the range `[0, A.length)`

, and the indices in `B`

are also in the same range, we can use the fact that a single integer can encode two values in binary using bitwise operations.

Here's how the modified code can look like:

`function reorderArrayWithNewIndexes(A, B) { // Encode the original and new values in a single integer const n = A.length; for (let i = 0; i < n; i++) { A[i] += (B[B[i]] % n) * n; } // Decode the new ordering from the encoded values for (let i = 0; i < n; i++) { A[i] = Math.floor(A[i] / n); }}`

This function also modifies the `A`

array in place, and assumes that `B`

contains valid indices for all elements of `A`

. The first loop encodes the original and new values of each element of `A`

in a single integer, so that we can perform an in-place reordering without using extra space. The second loop decodes the new ordering from the encoded values, so that `A`

corresponds to the new ordering specified by `B`

.