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

John La Rooy Punkte 278961

In Python

f=lambda n:n[0]if type(n)is list else[-n]

1voto

Cam Punkte 14515

Gute Frage!

Ich habe etwa 35 Sekunden gebraucht, um darüber nachzudenken und es zu schreiben:

int f(int n){
    static int originalN=0;
    if (n!=0)
        originalN=n;
    return n-originalN;
}

0 Stimmen

Definitiv Betrug... aber es funktioniert definitiv für alle Werte von n und ist einfach. x) Zuerst dachte ich, es würde nur beim ersten Mal funktionieren, wenn man f(f(n)) (wegen der statischen Initialisierung), aber es funktioniert tatsächlich auch für jedes weitere Mal. +1

0 Stimmen

Danke :) Im Grunde genommen ist diese Antwort eine freche Antwort auf eine ebenso freche Frage. Sollte man aufgrund einer solchen Frage wirklich Informatiker/Softwareingenieure einstellen (oder nicht einstellen)?

1voto

missingfaktor Punkte 88801

Scala :

def f(x: Any): Any = x match {
  case i: Int => new { override def hashCode = -i }
  case i @ _  => i.hashCode
}

Dasselbe gilt für Java:

public static Object f(final Object x) {
  if(x instanceof Integer) {
    return new Object() {
      @Override 
      public int hashCode() {
        return -(Integer)x;
      }
    };
  }
  return x.hashCode();
}

1voto

Anurag Punkte 136648

Eine weitere Javascript-Lösung, die Kurzschlüsse nutzt.

function f(n) {return n.inv || {inv:-n}}

f(f(1)) => -1
f(f(-1)) => 1

1voto

Anthony Punkte 11717

Ich dachte, ich versuche es mal mit dieser Frage, ohne mir vorher die Antworten anderer Leute anzusehen:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int f(int n) {
    if(n > 0) {  
        if(n % 2)
            return -(++n);
        else {
            return (--n);

        }
    }
    else {
        if(n % 2)
            return -(--n);
        else {
            return (++n);

        }
    }
}

int main(int argc, char\* argv\[\]) {
    int n;
    for(n = INT\_MIN; n < INT\_MAX; n++) {
        int N = f(f(n));

        if(N != -n) {
            fprintf(stderr, "FAIL! %i != %i\\n", N, -n);
        }
    }
    n = INT\_MAX;
    int N = f(f(n));
    if(N != -n) {
        fprintf(stderr, "FAIL! n = %i\\n", n);
    }
    return 0;
}

Ausgabe: [nichts]

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