Move Even Integers - codepath/compsci_guides GitHub Wiki

Unit 4 Session 1 (Click for link to problem statements)

U-nderstand

Understand what the interviewer is asking for by using test cases and questions about the problem.

  • What happens if all numbers are even or all are odd?
    • The function should handle these cases gracefully without making unnecessary swaps.
  • Should the function also sort the numbers within the even and odd groups?
    • No, the task is only to separate evens and odds, sorting them further is not needed.

P-lan

Plan the solution with appropriate visualizations and pseudocode.

General Idea: Use a two-pointer approach to separate even and odd numbers in the list.

1) 1) Initialize two pointers: `left` at the start and `right` at the end of the list.
2) While `left` is less than `right`:
  a) If the number at `left` is even, move `left` pointer one step to the right.
  b) If the number at `right` is odd, move `right` pointer one step to the left.
  c) If the number at `left` is odd and the number at `right` is even, swap them, then move both pointers.
3) Return the modified list.

⚠️ Common Mistakes

  • Failing to check the correct conditions before moving the pointers can lead to infinite loops or incorrect results.
  • Overlooking the importance of updating both pointers after a swap to avoid re-evaluating the same elements.

I-mplement

def sort_array_by_parity(nums):
    left, right = 0, len(nums) - 1
    
    while left < right:
        # Move left pointer forward if current number is even
        if nums[left] % 2 == 0:
            left += 1
        # Move right pointer backward if current number is odd
        elif nums[right] % 2 != 0:
            right -= 1
        # Swap when left pointer points to an odd number and right pointer points to an even number
        else:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1
    
    return nums