Search code examples
javaarrays

Swapping positions of duplicate values in array (Java)


Here i try to swap position of '9', so it comes right after a '4'.

Input : int[] nums1 = { 1, 4, 1, 9 };

Output: [1, 4, 9, 1]

And the code:

int loc4 = 0;
int temp = 0;

for (int i = 0; i < arr.length; i++) {
    if (arr[i] == 4) {
        loc4 = i;   
    }

    if (arr[i] == 9) {
        for (int j = i; j > 0; j--) {
            temp = arr[i];
            arr[i] = arr[loc4 + 1];
            arr[loc4 + 1] = temp;
        }
    }
}

The problem with this code is that once there's multiple 4s and 9s, it ignores the duplicates.

So i tried adding a repetition count and a continue statement, for when rep count is more than 1, but that doesn't seem to work?

int loc4 = 0;
int temp = 0;
int rep = 0;
for (int i = 0; i < arr.length; i++) {
    if (arr[i] == 4) {
        loc4 = i;
        rep++;
    }

    if (arr[i] == 9) {
        for (int j = i; j > 0; j--) {
            temp = arr[i];
            arr[i] = arr[loc4 + 1];
            arr[loc4 + 1] = temp;

            if (rep > 1)
                continue;
        }   
    }
}

So when my input is: int[] nums2 = { 1, 4, 1, 9, 9, 4, 1 };

My output should be: [1,4,9,1,1,4,9]

And what i'm getting is: [1, 4, 9, 1, 9, 4, 1]

Note that when there're singular 4s and 9s or when they're already in order, nothing will take place.


Solution

  • First, you should check what continue does: What is the "continue" keyword and how does it work in Java?

    Here is a solution that is kind of a different algorithm than yours. (I hope I didn't leave any edge cases open)

    public static void foo(int[] arr)
    {
            int i = 0;
    
            while(i != arr.Length)
            {
                if (arr[i] == 4 || arr[i] == 9)
                {
                    if (arr[i] == 4)//find the next 9 and swap with arr[i+1]
                    {
                        int j = i+1;
    
                        while(arr[j] != 9 && j < arr.Length)
                        {
                            j++;//inc j while arr[j] is not 9
                        }
    
                        if (arr[j] == 9)
                        {
                            int temp = arr[i + 1];
                            arr[i + 1] = arr[j];
                            arr[j] = temp;
                            i += 2; //skip over '9' that just replaced
                        }
                        else
                        {
                            i++;// didn't find '9' so move on to next index 
                        }
                    }
                    else if (arr[i] == 9)   // find  the next '4' and swap with the number that comes after it, and don't increment i if found..
                    {
                        int j = i + 1;
    
                        while (arr[j] != 4 && j < arr.Length)
                        {
                            j++;//inc j while arr[j] is not '4'
                        }
    
                        if (arr[j] == 4 && j < arr.Length)
                        {
                            int temp = arr[i];
                            arr[i] = arr[j+1];
                            arr[j+1] = temp;
                        }
                        else
                        {             
                            i++;  // didn't find '4' so move on to next index             
                        }
                    }
                }
                else // not 4 or 9
                {
                    i++; //move on to next index
                }
            }
        }