Rearrange Array Elements by Sign

Updated on 23 June, 2025
Rearrange Array Elements by Sign header image

Problem Statement

The task involves arranging the elements of a given integer array, nums, such that the resulting arrangement meets specific conditions. The array nums is characteristically zero-indexed, of even length, and contains an equal number of positive and negative integers.

The conditions for rearranging nums are as follows:

  1. Each pair of consecutive integers in the rearranged array must consist of one positive and one negative integer.
  2. Within the rearranged array, the relative order of the integers that share the same sign as they appeared in the original array must be maintained.
  3. The first integer of the rearranged array must be positive.

The output involves returning the modified version of nums that conforms to these conditions. This challenge requires careful separation and recombination of the positive and negative integers while preserving their original order from the array.

Examples

Example 1

Input:

nums = [3,1,-2,-5,2,-4]

Output:

[3,-2,1,-5,2,-4]

Explanation:

The positive integers in nums are [3,1,2]. The negative integers are [-2,-5,-4].
The only possible way to rearrange them such that they satisfy all conditions is [3,-2,1,-5,2,-4].
Other ways such as [1,-2,2,-5,3,-4], [3,1,2,-2,-5,-4], [-2,3,-5,1,-4,2] are incorrect because they do not satisfy one or more conditions.

Example 2

Input:

nums = [-1,1]

Output:

[1,-1]

Explanation:

1 is the only positive integer and -1 the only negative integer in nums.
So nums is rearranged to [1,-1].

Constraints

  • 2 <= nums.length <= 2 * 105
  • nums.length is even
  • 1 <= |nums[i]| <= 105
  • nums consists of equal number of positive and negative integers.

Approach and Intuition

To solve the problem effectively, here's a stepwise approach to manipulating the array so that it meets all mentioned conditions:

  1. Extract all positive and negative numbers from the array while preserving their order.

    • This involves iterating through the array and separating numbers into two different lists based on their sign.
  2. Prepare to merge the two lists maintaining the rule that a positive number comes first followed by a negative number.

    • Initiate two pointers or iterators, one for the list of positive numbers and another for the list of negative numbers.
  3. Start constructing the new array by alternately appending items from the list of positive numbers and the list of negative numbers.

    • Given that the array must start with a positive number, append from the positive list first.
  4. Continue the alternate appending until both lists are exhausted.

The solution adheres to the constraints and conditions provided:

  • Each step ensures the order of numbers with the same sign is maintained.
  • The algorithm starts with a positive integer and alternately appends negative ones maintaining the interlacing sign pattern.
  • Efficient usage of simple data structures (like lists) and iteration guarantees a straightforward implementation without delving into complex operations.

Using the aforementioned approach, any input array nums, which adheres to the given constraints, can be successfully restructured to meet the desired conditions.

Solutions

  • C++
  • Java
  • JavaScript
  • Python
cpp
class Solution {
public:
    vector<int> alternateElements(vector<int>& arr) {
        int size = arr.size();

        // Create result vector initialized to zero
        vector<int> result(size, 0);

        // Pointers to fill positive and negative numbers alternatively
        int evenPos = 0, oddPos = 1;

        for (int i = 0; i < size; i++) {
            if (arr[i] > 0) {
                // Assign positive numbers to even positions
                result[evenPos] = arr[i];
                evenPos += 2;
            } else {
                // Assign negative numbers to odd positions
                result[oddPos] = arr[i];
                oddPos += 2;
            }
        }

        return result;
    }
};

The provided C++ code defines a method alternateElements within a class Solution, which rearranges elements of an array by sign, ensuring that positive and negative numbers alternate, starting with a positive number.

  • Initialize size to determine the length of the input array arr.
  • Create a result vector of the same size, initialized with zeros to hold the rearranged elements.
  • Declare two pointers, evenPos and oddPos, initialized to 0 and 1 respectively. These pointers are used to place positive and negative numbers in even and odd positions respectively.
  • Iterate through each element in the input array:
    • If the element is positive, place it at the current evenPos in the result vector, then increase evenPos by 2 to point to the next available even index.
    • If the element is negative, place it at the current oddPos in the result vector, then increase oddPos by 2 to point to the next available odd index.
  • Return the result vector, which now contains the elements rearranged such that positive and negative numbers alternate, starting with a positive number if available.
java
class Solution {
    public int[] reorderElements(int[] elements) {
        int length = elements.length;
        int[] result = new int[length];
        int positiveIndex = 0, negativeIndex = 1;

        for (int idx = 0; idx < length; idx++) {
            if (elements[idx] > 0) {
                result[positiveIndex] = elements[idx];
                positiveIndex += 2;
            } else {
                result[negativeIndex] = elements[idx];
                negativeIndex += 2;
            }
        }

        return result;
    }
}

Here is a succinct summary of programming a method in Java to rearrange an array's elements based on their sign so that positive and negative numbers are alternated.

  • The provided Java method reorderElements accepts an array of integers elements.
  • It initializes variables length to get the number of elements in the input array and result to store the reordered elements.
  • Two indices positiveIndex and negativeIndex are set up starting at 0 and 1 respectively. These serve as markers to place positive and negative numbers in the correct positions.
  • A loop iterates through the input array:
    • If an element is positive, it gets placed at positiveIndex, which is then incremented by 2, skipping the next spot for a negative number.
    • If an element is negative, it gets placed at negativeIndex, which is also incremented by 2 to leave space for a subsequent positive number.
  • This alternation continues until all elements are processed placing them alternately according to their sign starting with the positive.
  • The result array is then returned, now fully reordered.

Execute this method using an array of integers, and it will rearrange them, positioning positive and negative integers alternately, starting with the positive ones.

js
/**
 * @param {number[]} numbers
 * @return {number[]}
 */
var reorderArray = function(numbers) {
    const size = numbers.length;

    // Create an array to store result
    const result = new Array(size).fill(0);

    // Pointers for even and odd positions
    let evenPos = 0, oddPos = 1;

    for (let index = 0; index < size; index++) {
        if (numbers[index] > 0) {
            // Assign positive number to even position
            result[evenPos] = numbers[index];
            evenPos += 2;
        } else {
            // Assign negative number to odd position
            result[oddPos] = numbers[index];
            oddPos += 2;
        }
    }

    return result;
};

In the given JavaScript code, the objective is to reorder an array such that all positive integers are placed at even indices (0, 2, 4, ...) and all negative integers are placed at odd indices (1, 3, 5, ...). Here's how the code achieves this:

  • Initialize the size of the input array numbers.
  • Create an result array of the same size, pre-filled with zeros to store reorganized numbers.
  • Set pointers evenPos and oddPos to manage placements of positive and negative numbers at even and odd indices respectively.
  • Iterate over each element in the numbers array:
    • If the element is positive, place it at the current value of evenPos in the result array, then increment evenPos by 2 to point to the next even index.
    • If the element is negative, assign it to the position indicated by oddPos in the result array, then increase oddPos by 2 to move to the next odd index.
  • Return the result array which now contains the numbers rearranged by sign according to the specified rule.

This solution efficiently rearranges the array with a single pass through the original array, using constant extra space for the pointers, and total space proportional to the input size for the output array.

python
class Solution:
    def rearrange_elements(self, elements: List[int]) -> List[int]:
        length = len(elements)
        rearranged = [0] * length
        positive_idx, negative_idx = 0, 1

        for index in range(length):
            if elements[index] > 0:
                rearranged[positive_idx] = elements[index]
                positive_idx += 2
            else:
                rearranged[negative_idx] = elements[index]
                negative_idx += 2

        return rearranged

The provided Python script offers a solution for rearranging an array's elements by their sign. The script ensures that positive and negative numbers alternate, starting with a positive number. The function rearrange_elements accomplishes this task using the following approach:

  • Initialize two pointers, positive_idx for positive elements, which starts at index 0, and negative_idx for negative elements, starting at index 1.
  • Iterate over the array and place positive numbers at the even indices (positive_idx) and negative numbers at the odd indices (negative_idx).
  • Increment the respective indexes by 2 (i.e., positive_idx += 2 and negative_idx += 2) to ensure the alternation between positives and negatives.
  • Return the rearranged array.

This method efficiently keeps the structural integrity of the input list while reordering elements, ensuring an optimal approach to separate positive and negative numbers per the specified pattern.

Comments

No comments yet.