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?

1voto

dtech Punkte 46172

Nun, ich bin weder ein Mathe- noch ein Programmiergenie, aber ist das nicht ziemlich einfach?

int f(int i) {
    static bool b;
    if (b) {
        b = !b;
        return i;
    } else {
        b = !b;
        return -i;
    }
}

Getestet mit großen und kleinen positiven und negativen Werten, INT_MIN, INT_MAX, es scheint zu funktionieren... Kann thread-safe gemacht werden, wenn das ein Anliegen ist, es war nicht ein Teil der Zuordnung aber.

Oder übersehe ich vielleicht etwas?

0 Stimmen

Ich würde nicht erwarten, dass dies eine akzeptable Antwort ist. Stellen Sie sich zum Beispiel Folgendes vor: var x = f(1), y = f(2); console.log(f(x));

0 Stimmen

@kybernetikos: die Bedingung war f(f(n)) == -n - Beachten Sie das Format des Anrufs, so dass es unmöglich ist, das zu erreichen, was Ihr Szenario erreicht. Wenn Sie so viel über den Aufruf, wie Sie tun - erstellen Sie einfach eine Wrapper-Methode, die den verschachtelten Aufruf für Sie tut...

0voto

rplusg Punkte 3378
int f(int n)
{
  static long counter=0;
  counter++;
  if(counter%2==0)
    return -n;
  else
    return n;
}

0voto

jcoder Punkte 28716

Ich glaube, dass dies alle Anforderungen erfüllt. Nichts besagt, dass die Parameter 32-Bit-Ganzzahlen mit Vorzeichen sein müssen, sondern nur, dass der Wert "n", den Sie übergeben, dies ist.

long long f(long long n)
{
    int high_int = n >> 32;
    int low_int  = n & 0xFFFFFFFF;

    if (high_int == 0) {
        return 0x100000000LL + low_int;
    } else {
        return -low_int;
    }
}

0voto

Dinah Punkte 50664

C# Überladen:

string f(int i) {
  return i.ToString();
}

int f(string s) {
  return Int32.Parse(s) * -1;
}

Oder

object f(object o) {
  if (o.ToString.StartsWith("s"))
    return Int32.Parse(s.Substring(1)) * -1;
  return "s" + i.ToString();
}

0voto

RHSeeger Punkte 15604

Tcl:

proc f {input} {
    if { [string is integer $input] } {
      return [list expr [list 0 - $input]]
    } else {
      return [eval $input]
    }
}

% f [f 1]
-1

In Anlehnung an einige der anderen Antworten... wenn es eine ganze Zahl ist, geben Sie einen Befehl zurück, der das Negativ dieser Zahl zurückgibt. Wenn es sich nicht um eine Zahl handelt, werte sie aus und gib das Ergebnis zurück.

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