Given an array containing both positive and negative elements, arrange in such a manner; 1 positive number, then 1 negative,then 1 positive and so on. If there are more negative numbers, extra negative numbers should be kept at the end and vice versa. Note that the order of negative and positive elements should be same in the modified array and you are not allowed to use any extra space. Sample inputs and outputs:
Input : [1 -2 3 4 -5 -6 7 8 -9 10 11] Output: [1 -2 3 -5 4 -6 7 -9 8 10 11] Input : [-1 2 3 4 -5 -6 7 8 -9 10 11] Output: [-1 2 -5 3 -6 4 -9 7 8 10 11] Input : [-1 2 -3 4 -5 6 -7 8 -9 10 11] Output: [-1 2 -3 4 -5 6 -7 8 -9 10 11] Input : [1 2 3 4 5 6 7 8 9 10 11] Output: [1 2 3 4 5 6 7 8 9 10 11] Input : [-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11] Output: [-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11]
package main import ( "fmt" ) func shiftAndSwap(a []int, fromIdx, toIdx int) { tmp := a[toIdx] for j := toIdx; j > fromIdx; j-- { a[j] = a[j-1] } a[fromIdx] = tmp } func arrange(a []int) { positive := false if a[0] < 0 { positive = true } fromIdx := 1 for i := 1; i < len(a); i++ { if positive { if a[i] >= 0 { if fromIdx != i { shiftAndSwap(a, fromIdx, i) i = fromIdx } positive = false fromIdx = i + 1 } } else { // negative if a[i] < 0 { if fromIdx != i { shiftAndSwap(a, fromIdx, i) i = fromIdx } positive = true fromIdx = i + 1 } } } } func main() { a := []int{1, -2, 3, 4, -5, -6, 7, 8, -9, 10, 11} fmt.Println("Input :", a) arrange(a) fmt.Println("Output:", a) a = []int{-1, 2, 3, 4, -5, -6, 7, 8, -9, 10, 11} fmt.Println("Input :", a) arrange(a) fmt.Println("Output:", a) a = []int{-1, 2, -3, 4, -5, 6, -7, 8, -9, 10, 11} fmt.Println("Input :", a) arrange(a) fmt.Println("Output:", a) a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} fmt.Println("Input :", a) arrange(a) fmt.Println("Output:", a) a = []int{-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11} fmt.Println("Input :", a) arrange(a) fmt.Println("Output:", a) }