We can’t use ArrayList or something like that, because the teacher told us to not use them, so I got stuck at this point. The signature of the function is:
public static int[] deleteNth(int[] elements, int maxOccurrences){}
I already go down over the array and get the lenght for the copied int result[] that i will return but now i got stucked thinking how i can paste certain elements. I wrote the I/O of the method:
deleteNth(new int[] {20,37,20,21}, 1) // return [20,37,21]
deleteNth(new int[] {1,1,3,3,7,2,2,2,2}, 3) // return [1, 1, 3, 3, 7, 2, 2, 2]
In a last chance for me, i try something like this but my brains burn out
for(int n:result) {
int n1=0;
boolean nope=false;
for(;n1<elements.length;) {
//TODOthings
}
result[n]=elements[n1];
}
For those people who don’t believe me, here’s my code:
public static int[] deleteNth(int[] elements, int maxOccurrences) {
int[] result = null;
if (elements != null && maxOccurrences > 0) {
int result_lenght=elements.length;
int ocurrences=0;
for(int n:elements) {
for(int n1:elements) {
if(n==n1 && ocurrences!=maxOccurrences) {
ocurrences++;
result_lenght--;
}
}
}
result=new int[result_lenght];
for(int n:result) {
int n1=0;
boolean nope=false;
for(;n1<elements.length;) {
//todothings
}
result[n]=elements[n1];
}
}else {
result=elements;
}
return result;
}
Advertisement
Answer
A possible straightforward solution (albeit inefficient) would be to start by creating a method that accepts as parameter an array, the number of elements on it, and a value, and returns the number of times that the value appears in the array, something like:
int total_occurences(int[] elements, int size, int value)
Use that method in your main code:
int copy[] = new int [elements.length];
int elements_copied = 0;
for(int i = 0; i < elements.length; i++) {
// Check if you are "allowed" to copy the element
if(total_occurences(copy, elements_copied , value <= maxOccurrences){
copy[elements_copied] = element[i];
elements_copied ++;
}
}
// copy the content to a new array of size = elements_copied
// return that array
The main idea is to first create an array (i.e., int copy[] = new int [elements.length]) with the same size as the array elements, since you do not beforehand how many duplicates there are. Iterate over the array elements, and for the current element (i.e., element[i]) check if we already have a copied (that element) the maximum number allowed (i.e., maxOccurrences):
if(total_occurences(copy, elements_copied , value <= maxOccurrences)
if not copy the element and increment the number of elements copied so far:
copy[elements_copied] = element[i]; elements_copied ++;
We need to use a different variable to iterate over the copy array because it might contain a different number of elements than the array elements. For instance, after a duplicated number has been “removed”. In the end, you can create a new array (the one to be returned) with a size equals to the variable elements_copied, and copy the elements from the copy array into this newly created array. In this way, you will return an array without missing values at the end of it.