847 Stimmen

Bestimmung der Funktion f(f(n)) == -n

Eine Frage, die mir bei meinem letzten Vorstellungsgespräch gestellt wurde:

Eine Funktion entwerfen f , so dass:

f(f(n)) == -n

Wo n ist ein 32-Bit vorzeichenbehaftete Ganzzahl Sie können nicht mit komplexen Zahlen arithmetisch rechnen.

Wenn Sie eine solche Funktion nicht für den gesamten Zahlenbereich entwickeln können, entwickeln Sie sie für den größtmöglichen Bereich.

Irgendwelche Ideen?

6 Stimmen

Um welche Stelle ging es bei diesem Vorstellungsgespräch?

3voto

Bill K Punkte 61074

Obwohl in der Frage gesagt wurde, dass n ein 32-Bit-Int sein muss, wurde nicht gesagt, dass der Parameter oder der Rückgabetyp ein 32-Bit-Int sein muss. Dies sollte in Java kompilierbar sein - in C könnte man das != 0 weglassen.

private final long MAGIC_BIT=1<<38;
long f(long n) {
    return n & MAGIC_BIT != 0 ? -(n & !MAGIC_BIT) : n | MAGIC_BIT;
}

bearbeiten:

Das ist eigentlich eine sehr gute Frage für ein Vorstellungsgespräch. Die besten Fragen sind die, die schwer oder gar nicht zu beantworten sind, weil sie die Leute zwingen, darüber nachzudenken, und man kann sie beobachten und darauf achten:

  • Geben sie einfach auf?
  • Sagen sie, es sei dumm?
  • Versuchen sie einzigartige Ansätze?
  • Kommunizieren sie mit Ihnen, während sie an dem Problem arbeiten?
  • Fordern sie eine weitere Verfeinerung der Anforderungen?

usw.

Beantworten Sie niemals nur Verhaltensfragen, es sei denn, Sie haben eine SEHR GUTE Antwort. Seien Sie immer freundlich und versuchen Sie, den Fragesteller einzubeziehen. Lassen Sie sich nicht frustrieren und geben Sie nicht vorzeitig auf! Wenn Sie wirklich nicht weiterkommen, versuchen Sie etwas völlig Illegales, das funktionieren könnte, und Sie erhalten fast die volle Punktzahl.

3voto

Billy ONeal Punkte 100691

Wie wäre es damit?

int nasty(int input)
{
    return input + INT_MAX/2;
}

0 Stimmen

Hmm ... Ich glaube, ich habe einen Tippfehler gemacht. Im Grunde geht es darum, die Integer-Variable überlaufen zu lassen, bis sie im negativen Bereich ist. Aber ich glaube, ich habe hier etwas vermasselt... ignorieren.

0 Stimmen

Interessante Lösung, ich hatte auch eine ähnliche Lösung. Aber ich habe gemerkt, dass es keine Lösung ist. Apropos Bytes: 1+63=64, 64+63=127. Sogar 127+1 = -128, nicht -1. Warum wird diese falsche Lösung hochgevotet?

0 Stimmen

@user: Ich weiß es selbst nicht. Ich glaube, ich habe in einem Kommentar eingeräumt, dass ich etwas vermasselt habe. Ich glaube, er wurde hochgestuft, weil der Punkt stimmig ist, auch wenn der genaue Code nicht perfekt ist. Ich hätte diese Antwort gelöscht, habe es aber nicht getan, weil sie CW ist.

3voto

user534212 Punkte 1
  1. Konvertieren von n in die Darstellung von Vorzeichen und Größenordnung;
  2. Fügen Sie 1/4 eines Bereichs hinzu;
  3. Zurück konvertieren.

    #define STYPE int
    STYPE sign_bit = (unsigned STYPE) 1 << ( sizeof ( STYPE ) * 8  - 1 );
    STYPE f ( STYPE f )
    {
        unsigned STYPE smf = f > 0 ? f : -f | sign_bit;
        smf += sign_bit >> 1;
        return smf & sign_bit ? -( smf & ~sign_bit ) : smf;
    }

3voto

Stefan Haustein Punkte 17787

Anhand der in der Frage angegebenen Informationen können Sie

  1. Umwandlung von 2-Komplement- in Vorzeichen-Bit-Darstellung
  2. Wenn das letzte Bit gesetzt ist, werden das Vorzeichenbit und das letzte Bit umgedreht; andernfalls wird nur das letzte Bit umgedreht.
  3. Zurück zu 2-Komplement konvertieren.

Sie gehen also grundsätzlich von ungerade -> gerade -> ungerade oder gerade -> ungerade -> gerade und ändern das Vorzeichen nur bei geraden Zahlen. Die einzige Zahl, bei der das nicht funktioniert, ist -2^31

Code:

function f(x) {
  var neg = x < 0;
  x = Math.abs(x) ^ 1;
  if (x & 1) {
    neg = !neg;
  }
  return neg ? -x : x;
}

3voto

Joe Phillips Punkte 46741
f(n) { return -1 * abs(n) }

Wie kann ich damit Überlaufprobleme umgehen? Oder verstehe ich den Sinn nicht?

0 Stimmen

Sie geben immer negative Werte zurück, auch wenn die Eingabe negativ ist.

1 Stimmen

Angesichts der Anforderungen der Frage ist das wahrscheinlich eine angemessene Antwort. Es wird nicht gesagt, dass f(n) einen anderen Wert zurückgeben muss. Die Frage ist ein Rätsel, also suchen Sie nach den Möglichkeiten (Schlupflöchern), die eine machbare Lösung ergeben würden.

0 Stimmen

@Jason: Das Problem ist, dass f(f(n)) für eine negative Eingabe n eine positive Zahl liefern sollte (gemäß der Frage), was Ihre Lösung nicht tut, da sie immer eine negative Zahl liefert.

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