user1080519
user1080519

Reputation: 55

Completely stumped on a multiple loop Java program

The following is NOT a homework problem, it's just a set of problems that I've been working through for practice and I was wondering if anybody else could figure it out:

http://codingbat.com/prob/p159339

Return an array that contains exactly the same numbers as the given array, but rearranged so that every 3 is immediately followed by a 4. Do not move the 3's, but every other number may move. The array contains the same number of 3's and 4's, every 3 has a number after it that is not a 3 or 4, and a 3 appears in the array before any 4.

*SOLVED - here is my working code:

    public int[] fix34(int...nums) 
{
    int[] returnArray = new int[nums.length];

    //ASSIGN ARRAY
    //We know that all 3's can't be moved, and after every 3 there
    //will automatically be a 4

    for(int i = 0; i<nums.length; i++)
    {
        if(nums[i] == 3)
        {
           returnArray[i] = 3;
           returnArray[i+1] = 4;
        }
    }

    //REBUILD ARRAY - UNMOVED INDEXES
    //If a value was not moved/affected by the above, it will get placed into the array
    //in the same position

    for (int i = 0; i < nums.length; i++)
    {
        if (returnArray[i] != 3 && returnArray[i] != 4 && nums[i] != 3 && nums[i] != 4)
        {
            returnArray[i] = nums[i];
        }
    }       

    //REBUILD ARRAY - MOVED INDEXES
    //changed values = 0 in returnArray, as a result, any time we hit a 0 we
    //can simply assign the value that was in the 4's place in the nums array

    OuterLoop: for (int i = 0; i < nums.length; i++)
    {
        if (returnArray[i] == 0)
        {
            for (int n = 0; n < returnArray.length; n++)
            {
                if (returnArray[n] == 4)
                {
                    returnArray[i] = nums[n];
                    continue OuterLoop;
                }
            }
        }
    }

    return returnArray;
}

Upvotes: 0

Views: 932

Answers (5)

LinuxHaxxor
LinuxHaxxor

Reputation: 11

I solved mine using two ArrayLists which contain the places of 3's and 4's. I hope this helps.

public int[] fix34(int[] nums) 
{
      //Create a copy of nums to manipulate.
      int[] ret = nums;
      //Create two ArrayLists which carry corresponding places of 3 and 4;
      ArrayList<Integer> threePositions = new ArrayList<Integer>();
      ArrayList<Integer> fourPositions = new ArrayList<Integer>();
      //Get the places of 3 and 4 and put them in the respective ArrayLists.
      for (int i = 0; i < ret.length; i++)
      {
        if (ret[i] == 3)
        {
          threePositions.add(i);
        }
        if (ret[i] == 4)
        {
          fourPositions.add(i);
        }
      }
      //Swap all ints right after the 3 with one of the 4s by using the referenced
      //ArrayLists values.
      for (int i = 0; i < threePositions.size(); i++)
      {
        int temp = ret[threePositions.get(i) + 1];
        ret[threePositions.get(i) + 1] = ret[fourPositions.get(i)];
        ret[fourPositions.get(i)] = temp;
      }
      //Return the ret array.
      return ret;
    }

Upvotes: 0

TheArchon
TheArchon

Reputation: 313

Here's mine: A little overkill, but is always right, anyways i make 2 additional arrays and I make 2 passes in the loop putting the correct elements in the correct places. See Logic Below.

public int[] fix34(int[] nums) {
  int index1 = 0;
  int index2 = 0;
  int index3 = 0;
  int[] only4 = fours(nums); //holds all 4's in nums
  int[] misc = new int[count4(nums)]; //will hold numbers after 3
  for(int a = 0; a < nums.length - 1; a++){
  if(nums[a] == 3){
  misc[index1] = nums[a + 1]; //get it for later use
  index1++;
  nums[a + 1] = only4[index2]; //now the number after 3 is a 4, from the 
  index2++;                    //only4 array
  }
  }
  for(int b = 1; b < nums.length; b++){
  if(nums[b] == 4  && nums[b - 1] != 3){ //finds misplaced 4's
  nums[b] = misc[index3]; //replaces lone 4's with the
  index3++; //right hand side of each 3 original values.
  }
  }
  return nums;
}
public int count4(int[] nums){
  int cnt = 0;
  for(int e : nums){
  if(e == 4){
  cnt++;
  }
  } 
  return cnt;
}
public int[] fours(int[] nums){
  int index = 0;
  int[] onlyFours = new int[count4(nums)]; //must set length
  for(int e : nums){
  if(e == 4){
  onlyFours[index] = e;
  index++;
  }
  }
  return onlyFours;
}

Upvotes: 0

abhimita
abhimita

Reputation: 41

public int[] fix34(int[] nums) {
    int[] arr = new int[nums.length];
            int index = 0;
            int tempVal= 0,j=0;

            for(int i=0;i<nums.length;i++){
                if(nums[i]==3){
                    arr[i] = nums[i];
                    index=i+1;
                    tempVal = nums[i+1];
                    j=index;

                    while(j<nums.length){
                        if(j<nums.length && nums[j]==4){


                            //System.out.println(j+"\t="+nums[j]);
                            nums[j]=tempVal;
                            nums[index] = 4;
                            break;

                        }
                        j++;

                    }
                    tempVal=0;
                    index=0;
                    }else{
                    arr[i] = nums[i];
                }


            }

            index =0;


            for(int i=0;i<nums.length;i++){
                if(nums[i]==3 && nums[i+1]==4){
                    i+=1;
                }else if(nums[i]==4){
                    index = i;
                    j=index;

                    while(j<nums.length){
                        if(nums[j]==3 && nums[j+1]!=4){

                            arr[index] = nums[j+1];
                            arr[j+1] = 4;

                        }

                        j++;
                    }

                }
            }

            return arr;
    }

Upvotes: 0

noMAD
noMAD

Reputation: 7844

Initialize all the variables

    for(int i = 0; i<n-1; i++)
    {
        if(arr[i] == 3)
        {
            if(arr[i+1] == 4)
                continue;
            else
            {
                temp = 0;
                while(arr[temp] != 4)
                    temp++;
                //Write your own code here
            }
         //Complete the code
    }

I have NOT provided the entire code. Try completing it as you said it was for your practice.

Upvotes: 0

temporary_user_name
temporary_user_name

Reputation: 37068

I don't know java, but maybe I can help anyway. i dont want to give you the solution, but think of it like this:

you can move every number that isn't a 3. that's our only limit. that being said:

the only spots you need to change are the spots following 3s....so....every time you loop through, your program should be aware if it finds a spot after a 3 that isn't a 4....

it should also be aware if it finds any 4s not preceded by a 3......

during each loop, once it's found the location of each of those two things, you should know what to do.

Upvotes: 2

Related Questions