6 svar
118 visningar
Na5a 403
Postad: 17 aug 2021 16:43

Ta bort duplicerade element i en array

Jag försöker skapa en metod som hittar de gemensamma elementen i två arrayer, lägger in dessa i en egen array och tar sedan bort de som är duplicerade. Ett exempel på input kan vara

int [] arr1 = {1,2,3}
int [] arr2 = {1,7,0,7,8,9,1,1,1}

output bör då vara {1}

Med koden som jag har nu så skulle jag få ut {1,0,0,0,0,0,1,1,1}

int[] inBoth(int[] arr1, int[] arr2) {
        int count = 0;
        for (int i = 0; i < arr1.length; i++) {
            for (int k = 0; k < arr2.length; k++) {
                if (arr1[i] == arr2[k]) {
                    count++;

                }
            }
        }
        int[] commons = new int[count];
        for (int i = 0; i < arr1.length; i++) {
            for (int k = 0; k < arr2.length; k++) {
                if (arr1[i] == arr2[k]) {
                    commons[i] = arr1[i];
                }
            }
        }

        return commons;
    }
}
beerger 962
Postad: 17 aug 2021 16:49

Så med andra ord, metoden ska hitta element som finns i både arr1 och arr2?

beerger 962
Postad: 17 aug 2021 17:01

Ser inte hur du skulle få {1,0,0,0,0,0,1,1,1} med denna kod.

Du kommer få {1, 0, 0, 0}

Na5a 403
Postad: 17 aug 2021 17:24
beerger skrev:

Så med andra ord, metoden ska hitta element som finns i både arr1 och arr2?

Ja

Det här är ett exempel av det jag får:

Fermatrix 7841 – Fd. Medlem
Postad: 17 aug 2021 17:26 Redigerad: 17 aug 2021 17:28

Du skulle kunna köra merge sort och i en ny array lägga alla unika element. Hur vet vi at Ett element är unikt? Det ser vi lätt genom att jämföra nuvarande element med nästa.

Då får vi en komplexitet på nlogn vilket inte allt för dåligt.

Na5a 403
Postad: 17 aug 2021 17:48

Jag förstod mig inte riktigt på merge and sort, men jag testade denna approach istället

 int[] inBoth(int[] arr1, int[] arr2) {
        int count = 0;
        for (int i = 0; i < arr1.length; i++) {
            for (int k = 0; k < arr2.length; k++) {
                if (arr1[i] == arr2[k]) {
                    count++;

                }
            }
        }
        int[] commons = new int[count];
        for (int i = 0; i < arr1.length; i++) {
            for (int k = 0; k < arr2.length; k++) {
                if (arr1[i] == arr2[k]) {
                    commons[i] = arr1[i];
                }
            }
        }
       int [] arrayReturn = removeduplicates(commons, commons.length);
        
        return arrayReturn;
    }
    public static int [] removeduplicates(int a[], int n)
    {
        if (n == 0 || n == 1) {
            return a;
        }

        // creating another array for only storing
        // the unique elements
        int[] temp = new int[n];
        int j = 0;

        for (int i = 0; i < n - 1; i++) {
            if (a[i] != a[i + 1]) {
                temp[j++] = a[i];
            }
        }

        temp[j++] = a[n - 1];

        // Changing the original array
        for (int i = 0; i < j; i++) {
            a[i] = temp[i];
        }

        return temp;
    }

Den tar bort de duplicerade talen fast ersätter de med nollor så att det blir så här nu:

[0, 2, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0]

Jag vill att den enbart ska returnera [2,3,6]

Fermatrix 7841 – Fd. Medlem
Postad: 17 aug 2021 17:53 Redigerad: 17 aug 2021 17:53

Om du inte bryr dig om tidskomplexitet så kan du göra följande. 

Gör en array av storleken n+m, dvs en array stor nog att ta emot alla dina element. Använd den inbyggda sort funktionen, lägg alla unika element i en ny array. 

Notera att det finns mycket effektivare lösningar men jag antar att om du inte begriper merge sort så har du förmodligen inte börjat prata om algoritmer. Då känns det orimligt att din lärare skulle bry sig om tidskomplexitet.

Svara
Close