74 Stimmen

Wie findet man ein doppeltes Element in einem Array aus gemischten, aufeinanderfolgenden ganzen Zahlen?

Vor kurzem bin ich irgendwo auf eine Frage gestoßen:

Angenommen, Sie haben ein Array mit 1001 ganzen Zahlen. Die Zahlen sind in zufälliger Reihenfolge angeordnet, aber Sie wissen, dass jede der Zahlen zwischen 1 und 1000 (einschließlich) liegt. Außerdem kommt jede Zahl nur einmal in dem Array vor, mit Ausnahme einer Zahl, die zweimal vorkommt. Nehmen Sie an, dass Sie auf jedes Element des Arrays nur einmal zugreifen können. Beschreiben Sie einen Algorithmus, um die wiederholte Zahl zu finden. Wenn Sie in Ihrem Algorithmus Hilfsspeicher verwendet haben, können Sie einen Algorithmus finden, der diesen nicht benötigt?

Was mich interessiert, ist die zweiter Teil d.h., ohne Verwendung von Zusatzspeichern . Haben Sie eine Ahnung?

1voto

cobbal Punkte 68319

Zählen Argumente und Aufrufstapel als Zusatzspeicher?

int sumRemaining(int* remaining, int count) {
    if (!count) {
        return 0;
    }
    return remaining[0] + sumRemaining(remaining + 1, count - 1);
}

printf("duplicate is %d", sumRemaining(array, 1001) - 500500);

Bearbeiten: Version mit Schwanzaufruf

int sumRemaining(int* remaining, int count, int sumSoFar) {
    if (!count) {
        return sumSoFar;
    }
    return sumRemaining(remaining + 1, count - 1, sumSoFar + remaining[0]);
}
printf("duplicate is %d", sumRemaining(array, 1001, 0) - 500500);

1voto

Santhosh Punkte 11
n = 1000
s = sum(GivenList)
r = str(n/2)
duplicate = int( r + r ) - s

1voto

mRaza Punkte 67
public static void main(String[] args) {
    int start = 1;
    int end = 10;
    int arr[] = {1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
    System.out.println(findDuplicate(arr, start, end));
}

static int findDuplicate(int arr[], int start, int end) {

    int sumAll = 0;
    for(int i = start; i <= end; i++) {
        sumAll += i;
    }
    System.out.println(sumAll);
    int sumArrElem = 0;
    for(int e : arr) {
        sumArrElem += e;
    }
    System.out.println(sumArrElem);
    return sumArrElem - sumAll;
}

1voto

Sunil B N Punkte 3991
public int duplicateNumber(int[] A) {
    int count = 0;
    for(int k = 0; k < A.Length; k++)
        count += A[k];
    return count - (A.Length * (A.Length - 1) >> 1);
}

0voto

psihodelia Punkte 28004

Eine Dreieckszahl T(n) ist die Summe der n natürlichen Zahlen von 1 bis n. Sie kann als n(n+1)/2 dargestellt werden. Wenn man also weiß, dass von 1001 natürlichen Zahlen nur eine einzige doppelt vorkommt, kann man einfach alle gegebenen Zahlen addieren und T(1000) subtrahieren. Das Ergebnis wird dieses Duplikat enthalten.

Für eine Dreieckszahl T(n), wenn n eine beliebige Potenz von 10 ist, gibt es auch eine schöne Methode, die T(n) auf der Basis der Basis-10-Darstellung findet:

n = 1000
s = sum(GivenList)
r = str(n/2)
duplicate = int( r + r ) - s

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X