educative.io

Educative

Why is this code not working?

int* removeEven(int* &Arr, int size){
	int odd_Count = 0;					
	for(int i = 0; i < size; i++){
		if(Arr[i] % 2 == 0){
			++odd_Count;
		}
	}
	int* tempArr = new int[odd_Count];
	for(int i = 0; i < size; i++){
		if(Arr[i] % 2 == 0){
			tempArr[i] = Arr[i];
		}
	}
	delete [] Arr;
    Arr = tempArr;  	
	return Arr;
}

Hey @darko_lacen! So there are several reasons as to why your code isn’t working. Let us go by them step by step.

First of all, let us look at the following if condition:

if(Arr[i] % 2 == 0){
	++odd_Count;
}

Now, over here, you’re storing the even values rather than the odd values. This would be wrong since we want to remove the even values from our list. Therefore, this would be corrected to the following: if(Arr[i] % 2 != 0).

Moving further into the second loop, we, firstly, again need to correct the if condition. In addition, if you try running the current code, you might be getting a malloc issue. This is because if you notice, your tempArr has a size of only odd_Count and you’re looping over size. Hence, your tempArr is basically iterating over indexes that haven’t been defined so far.

A simple solution to this is keeping track of the indexes of the tempArr array. This can easily be done by creating a new variable and then incrementing that whenever our if condition gets to meet. You can see this below:

int* tempArr = new int[odd_Count];
int j = 0; // New variable created
for(int i = 0; i < size; i++){
	if(Arr[i] % 2 != 0){
		tempArr[j] = Arr[i]; // Incrementing the variable
        j++;
	}
}

The complete solution can be found below:

int* removeEven(int* &Arr, int size){
	int odd_Count = 0;					
	for(int i = 0; i < size; i++){
		if(Arr[i] % 2 != 0){
			++odd_Count;
		}
	}
	int* tempArr = new int[odd_Count];
    int j = 0;
	for(int i = 0; i < size; i++){
		if(Arr[i] % 2 != 0){
			tempArr[j] = Arr[i];
            j++;
		}
	}
	delete [] Arr;
    Arr = tempArr;  	
	return Arr;
}