gudii9
asked on
Fix45 challenge
Hi,
I am working on below challenge.
http://codingbat.com/prob/p125819
My psedo code of approach is
1. iterate given arry
2. find position of 4
3. set next position to 5 by keeping orignal value in buffere
4. create other for loop from index position where we found 4 plus two and if that value is 5 replace with buffere
5. return modified array
i am failing below tests. please advise
I am working on below challenge.
http://codingbat.com/prob/p125819
My psedo code of approach is
1. iterate given arry
2. find position of 4
3. set next position to 5 by keeping orignal value in buffere
4. create other for loop from index position where we found 4 plus two and if that value is 5 replace with buffere
5. return modified array
public int[] fix45(int[] nums) {
for (int z = 0; z < nums.length; z++)
if (nums[z] == 4) {
int buffer = nums[z + 1];
nums[z + 1] = 5;
for (int j = z + 2; j < nums.length; j++)
if (nums[j] == 5)
nums[j] = buffer;
}
return nums;
}
i am failing below tests. please advise
Expected Run
fix45([5, 4, 9, 4, 9, 5]) → [9, 4, 5, 4, 5, 9] [5, 4, 5, 4, 5, 9] X
fix45([1, 4, 1, 5]) → [1, 4, 5, 1] [1, 4, 5, 1] OK
fix45([1, 4, 1, 5, 5, 4, 1]) → [1, 4, 5, 1, 1, 4, 5] [1, 4, 5, 1, 1, 4, 5] OK
fix45([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9] [4, 5, 4, 5, 9, 9, 4, 5, 9] OK
fix45([5, 5, 4, 1, 4, 1]) → [1, 1, 4, 5, 4, 5] [5, 5, 4, 5, 4, 5] X
fix45([4, 2, 2, 5]) → [4, 5, 2, 2] [4, 5, 2, 2] OK
fix45([4, 2, 4, 2, 5, 5]) → [4, 5, 4, 5, 2, 2] [4, 5, 4, 5, 2, 2] OK
fix45([4, 2, 4, 5, 5]) → [4, 5, 4, 5, 2] [4, 5, 4, 5, 2] OK
fix45([1, 1, 1]) → [1, 1, 1] [1, 1, 1] OK
fix45([4, 5]) → [4, 5] [4, 5] OK
fix45([5, 4, 1]) → [1, 4, 5] [5, 4, 5] X
fix45([]) → [] [] OK
fix45([5, 4, 5, 4, 1]) → [1, 4, 5, 4, 5] [5, 4, 5, 4, 5] X
fix45([4, 5, 4, 1, 5]) → [4, 5, 4, 5, 1] [4, 5, 4, 5, 1] OK
fix45([3, 4, 5]) → [3, 4, 5] [3, 4, 5] OK
fix45([4, 1, 5]) → [4, 5, 1] [4, 5, 1] OK
fix45([5, 4, 1]) → [1, 4, 5] [5, 4, 5] X
fix45([2, 4, 2, 5]) → [2, 4, 5, 2] [2, 4, 5, 2] OK
other tests
What do all the cases you are failing have in common?
ASKER
one extra 5
one extra 5That's what's wrong with your result.
But what do the input arrays have in common?
ASKER
same number of 4's and 5's
ASKER
also every 4 has a number after it that is not a 4
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
they have 5 at beginning and failing
Below passes all tests
fix45 -->[1, 4, 5, 1]
any improvement/refinement/alt ernate approach?
Below passes all tests
public int[] fix45(int[] nums) {
for (int x = 0; x < nums.length; x++) {
if (nums[x] == 4) {
for (int y = 0; y < nums.length; y++) {
if (nums[y] == 5) {
if (y > 0 && nums[y-1] != 4) {
int buffer = nums[x+1];
nums[x+1] = 5;
nums[y] = buffer;
}
else if (y == 0) {
int buff = nums[x+1];
nums[x+1] = 5;
nums[y] = buff;
}
}
}
}
}
return nums;
}
Expected Run
fix45([5, 4, 9, 4, 9, 5]) → [9, 4, 5, 4, 5, 9] [9, 4, 5, 4, 5, 9] OK
fix45([1, 4, 1, 5]) → [1, 4, 5, 1] [1, 4, 5, 1] OK
fix45([1, 4, 1, 5, 5, 4, 1]) → [1, 4, 5, 1, 1, 4, 5] [1, 4, 5, 1, 1, 4, 5] OK
fix45([4, 9, 4, 9, 5, 5, 4, 9, 5]) → [4, 5, 4, 5, 9, 9, 4, 5, 9] [4, 5, 4, 5, 9, 9, 4, 5, 9] OK
fix45([5, 5, 4, 1, 4, 1]) → [1, 1, 4, 5, 4, 5] [1, 1, 4, 5, 4, 5] OK
fix45([4, 2, 2, 5]) → [4, 5, 2, 2] [4, 5, 2, 2] OK
fix45([4, 2, 4, 2, 5, 5]) → [4, 5, 4, 5, 2, 2] [4, 5, 4, 5, 2, 2] OK
fix45([4, 2, 4, 5, 5]) → [4, 5, 4, 5, 2] [4, 5, 4, 5, 2] OK
fix45([1, 1, 1]) → [1, 1, 1] [1, 1, 1] OK
fix45([4, 5]) → [4, 5] [4, 5] OK
fix45([5, 4, 1]) → [1, 4, 5] [1, 4, 5] OK
fix45([]) → [] [] OK
fix45([5, 4, 5, 4, 1]) → [1, 4, 5, 4, 5] [1, 4, 5, 4, 5] OK
fix45([4, 5, 4, 1, 5]) → [4, 5, 4, 5, 1] [4, 5, 4, 5, 1] OK
fix45([3, 4, 5]) → [3, 4, 5] [3, 4, 5] OK
fix45([4, 1, 5]) → [4, 5, 1] [4, 5, 1] OK
fix45([5, 4, 1]) → [1, 4, 5] [1, 4, 5] OK
fix45([2, 4, 2, 5]) → [2, 4, 5, 2] [2, 4, 5, 2] OK
other tests
package com.solution;
import java.util.Arrays;
public class Fix45 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] ar={1,4,1,5};
System.out.println("fix45 -->"+Arrays.toString(fix45(ar)));
}
public static int[] fix45(int[] nums) {
for (int x = 0; x < nums.length; x++) {
if (nums[x] == 4) {
for (int y = 0; y < nums.length; y++) {
if (nums[y] == 5) {
if (y > 0 && nums[y-1] != 4) {
int buffer = nums[x+1];
nums[x+1] = 5;
nums[y] = buffer;
}
else if (y == 0) {
int buff = nums[x+1];
nums[x+1] = 5;
nums[y] = buff;
}
}
}
}
}
return nums;
}
}
fix45 -->[1, 4, 5, 1]
any improvement/refinement/alt
I don't know if my solution is any better than yours. I create a new array. I fill it with the values from the input array. I return the new array.
public int[] fix45(int[] nums) {
int[] arr = new int[nums.length];
for (int z = 0; z < nums.length; z++){
if (nums[z] == 4) {
arr[z] = 4;
arr[z + 1] = 5;
}
}
int mark = 0;
for (int j = 0; j < nums.length; j++){
if(arr[j] == 0){
for (int k = mark; k < nums.length; k++){
if(nums[k] != 4 && nums[k] != 5){
arr[j] = nums[k];
mark = k + 1;
break;
}
}
}
}
return arr;
}
How does your pseudo code compare with this:
b = 0
for i= 0 to length
if (nums[i] == 4)
buff[b] = nums[i+1]
nums[i+1] = 5
b ++
b = 0
for i= 0 to length
if (nums[i] == 5)
if (i == 0)
nums[i] = buff[b]
b++
else if (nums[i-1] != 4)
nums[i] = buff[b]
b++
ASKER
what is the purpose of
mark = k + 1;
mark = k + 1;
public int[] fix45(int[] nums) {
int[] arr = new int[nums.length];
for (int z = 0; z < nums.length; z++){
if (nums[z] == 4) {
arr[z] = 4;
arr[z + 1] = 5;
}
}
int mark = 0;
for (int j = 0; j < nums.length; j++){
if(arr[j] == 0){
for (int k = mark; k < nums.length; k++){
if(nums[k] != 4 && nums[k] != 5){
arr[j] = nums[k];
mark = k + 1;
break;
}
}
}
}
return arr;
}
package com.solution;
import java.util.Arrays;
public class Fix46_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] ar = { 1, 4, 1, 5 };
System.out.println("fix45 -->" + Arrays.toString(fix45(ar)));
}
public static int[] fix45(int[] nums) {
int[] arr = new int[nums.length];
for (int z = 0; z < nums.length; z++){
if (nums[z] == 4) {
arr[z] = 4;
arr[z + 1] = 5;
}
}
int mark = 0;
for (int j = 0; j < nums.length; j++){
if(arr[j] == 0){
for (int k = mark; k < nums.length; k++){
if(nums[k] != 4 && nums[k] != 5){
arr[j] = nums[k];
mark = k + 1;
break;
}
}
}
}
return arr;
}
}
ASKER
i see using mark and other for loop you are trying to fill non 4 and non 5 values from imput nums asrray to output new arr array.
I found your solution of filling new array is more straight forward?
why are we starting second for loop from mark rather than 0?
I found your solution of filling new array is more straight forward?
why are we starting second for loop from mark rather than 0?
public int[] fix45(int[] nums) {
int[] arr = new int[nums.length];
for (int z = 0; z < nums.length; z++){
if (nums[z] == 4) {
arr[z] = 4;
arr[z + 1] = 5;
}
}
int mark = 0;
for (int j = 0; j < nums.length; j++){
if(arr[j] == 0){
for (int k = mark; k < nums.length; k++){
if(nums[k] != 4 && nums[k] != 5){
arr[j] = nums[k];
mark = k + 1;
break;
}
}
}
}
return arr;
}
ASKER
can i solve fix34 challenge with same above approach?
ASKER
i see you are using mark to increment inner for loop with k as you are breaking out of it prematurely for k++ to take place later.
i see you are using mark to increment inner for loop with k as you are breaking out of it prematurely for k++ to take place later.I used the mark variable to know where to begin looking for the next number to use to fill into the arr array. The increment in the loop(k++) is still used.
There probably is room for improvement. But, when you closed this question, I stopped working on this. Anyway, maybe adding some debug statements, will shed some light on my code. See below,
import java.util.Arrays;
public class Fix{
public static void main(String[] args) {
int[] input = {2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5};
System.out.println(" input -->" + Arrays.toString(input));
fix45(input);
}
public static int[] fix45(int[] nums) {
int[] arr = new int[nums.length];
for (int z = 0; z < nums.length; z++){
if (nums[z] == 4) {
arr[z] = 4;
arr[z + 1] = 5;
}
}
System.out.println(" output -->" + Arrays.toString(arr) + " (after first for loop)");
int mark = 0;
for (int j = 0; j < nums.length; j++){
if(arr[j] == 0){
for (int k = mark; k < nums.length; k++){
if(nums[k] != 4 && nums[k] != 5){
arr[j] = nums[k];
mark = k + 1;
System.out.println(" j is " + j + ", k is " + k + ", mark is " + mark);
System.out.println(" output -->" + Arrays.toString(arr));
break;
}
}
}
}
return arr;
}
}
The output is : input -->[2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5]
output -->[0, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0] (after first for loop)
j is 0, k is 0, mark is 1
output -->[2, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0]
j is 1, k is 1, mark is 2
output -->[2, 3, 4, 5, 4, 5, 0, 0, 4, 5, 0]
j is 6, k is 3, mark is 4
output -->[2, 3, 4, 5, 4, 5, 6, 0, 4, 5, 0]
j is 7, k is 5, mark is 6
output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 0]
j is 10, k is 9, mark is 10
output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 8]
ASKER
input -->[2, 3, 4, 6, 4, 7, 5, 5, 4, 8, 5]
output -->[0, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0] (after first for loop)
j is 0, k is 0, mark is 1
output -->[2, 0, 4, 5, 4, 5, 0, 0, 4, 5, 0]
j is 1, k is 1, mark is 2
output -->[2, 3, 4, 5, 4, 5, 0, 0, 4, 5, 0]
j is 6, k is 3, mark is 4
output -->[2, 3, 4, 5, 4, 5, 6, 0, 4, 5, 0]
j is 7, k is 5, mark is 6
output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 0]
j is 10, k is 9, mark is 10
output -->[2, 3, 4, 5, 4, 5, 6, 7, 4, 5, 8]
above output is more clear now. To understand again today taking some time around 1 hour even though i saw this day before yesterday?