Coman Marian
Coman Marian

Reputation: 13

How to merge an array with another one

I have a challenge to complete where I'm given an array [-1,4,-3,5,6,9,-2] and I need to get a new array that sorts the numbers in this order: [firstGreatest, firstLowest, secondGreatest, secondLowest ...and so on]. The negative and positive numbers may be different amount, as in 4 positive, 2 negative.

This is what I tried so far, but cannot think of a better solution.

let arr = [-1, 2, -5, 3, 4, -2, 6];


function someArray(ary) {
  const sorted = ary.sort((a, b) => a - b)

  const highest = sorted.filter(num => num > 0).sort((a, b) => b - a)
  const lowest = sorted.filter(num => num < 0).sort((a, b) => b - a)

  let copy = highest
  for (let i = 0; i < highest.length; i++) {
    for (let j = i; j < lowest.length; j++) {
      if ([i] % 2 !== 0) {
        copy.splice(1, 0, lowest[j])
      }
    }
  }
}
console.log(arr)
someArray(arr)
console.log(arr)

Upvotes: 1

Views: 174

Answers (4)

secan
secan

Reputation: 2679

The general idea is to sort the array (highest to lowest) then pick the first and the last element until the array is empty. One way of doing it could be:

const input = [-1, 2, -5, 3, 4, -2, 6];

function someArray(arr) {
  // sort the original array from highest to lowest
  const sorted = arr.sort((a, b) => b - a);

  const output = []

  while (sorted.length > 0) {
    // remove the first element of the sorted array and push it into the output
    output.push(...sorted.splice(0, 1));
    // [check to handle arrays with an odd number of items]
    // if the sorted array still contains items 
    // remove also the last element of the sorted array and push it into the output
    if (sorted.length > 0) output.push(...sorted.splice(sorted.length - 1, 1))
  }

  return output;
}

// test
console.log(`input: [${input.join(',')}]`);
console.log(`input (sorted desc): [${input.sort((a, b) => b - a).join(',')}]`)
console.log(`output: [${someArray(input).join(',')}]`);

Upvotes: 1

flyingturtles
flyingturtles

Reputation: 903

This is a simple and a shorter method:

function makearray(ar) {
  ar = points.sort(function(a, b) {
    return b - a
  })
  let newarray = []
  let length = ar.length
  for (let i = 0; i < length; i++) {
    if (i % 2 == 0) {
      newarray.push(ar[0])
      ar.splice(0, 1)
    } else {
      newarray.push(ar[ar.length - 1])
      ar.splice(ar.length - 1, 1)
    }
  }
  return newarray
}

const points = [-1, 2, -5, 3, 4, -2, 6]
console.log(makearray(points))

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386654

You could sort the array and pop or shift until you have no more items.

function greatestLowest(array) {
    let temp = [...array].sort((a, b) => a - b),
        m = 'shift',
        result = [];

    while (temp.length) result.push(temp[m = { pop: 'shift', shift: 'pop' }[m]]());
    return result;
}

console.log(...greatestLowest([-1, 2, -5, 3, 4, -2, 6]));

Upvotes: 2

DecPK
DecPK

Reputation: 25408

You can easily solve this problem with two pointers algorithm.

O(n log n) for sorting

O(n) for add the value in result.

Take two-variable i and j,

i points to the beginning of the sorted array

j points to the end of the sorted array

Now just add the value of the sorted array alternatively in final result

let arr = [-1, 2, -5, 3, 4, -2, 6];

function someArray(ary) {
  const sorted = arr.sort((a, b) => b - a);
  
  // declaration
  const result = [];
  let i = 0,
    j = sorted.length - 1,
    temp = true;
  
  // Algorithm
  while (i <= j) {
    if (temp) {
      result.push(sorted[i]);
      i++;
    } else {
      result.push(sorted[j]);
      j--;
    }
    temp = !temp;
  }
  return result;
}

console.log(someArray(arr));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 2

Related Questions