2016-12-13 4 views
0

in einer Interviewfrage wurde ich folgende gefragt:Was ist der Zweck dieser Methode?

Was ist der Zweck der folgenden Methode, und wie können wir es umschreiben?

public int question_1(int a, int b) 
{ 
    while (a > b) 
    { 
     a -= b; 
    } 
    return a; 
} 

zuerst dachte ich, es zu einer% b äquivalent ist, aber es ist nicht, da es "während (a> b)" und nicht "während (a> = b)" ist.

Dank

+4

Es gibt einen Grund, warum diese Art von Fragen in Interviews gestellt werden. Pencil und Papier und versuche ein paar Fälle ... –

+0

Ich denke, es ist äquivalent zu "a% b" ... hast du tatsächlich den Code getestet? –

+0

Was haben Sie dann beantwortet? Vielleicht ging es darum zu sehen, ob du aufpasst und bemerkst, dass '(n * m)% n '' n' und nicht '0' zurückgegeben hat? –

Antwort

4

Ehrlich gesagt, ist es unmöglich, den Zweck eines Verfahrens zu wissen, nur durch seine Umsetzung zu lesen, auch wenn wir davon ausgehen, dass es fehlerfrei ist.

Aber wir können durch die Dokumentation ihrer Verhaltensweisen beginnen:

  • Wenn b positiv ist:
    • Wenn a positiv ist, gibt die Methode die am wenigsten positive ganze Zahl, die a Modulo b deckungsgleich ist. (Zum Beispiel gegeben und 1510, wird es 5 zurückzukehren; gegeben und 3010, wird es 10 zurückzukehren.)
    • Andernfalls kehrt das Verfahren a.
  • Wenn b Null ist:
    • Wenn a positiv ist, springt das Verfahren für immer.
    • Andernfalls gibt die Methode a zurück.
  • Wenn b ist negativ:
    • Wenn ab, wobei das Verfahren a zurückgibt.
    • Andernfalls hängt das Verhalten der Methode von der Sprache ab, da sie a erhöht wird, bis sie nicht länger als b ist. Wenn die Sprache Integer-Arithmetik definiert, die "Wraparound" -Regeln verwendet, dann wird die Methode eine lange Zeit durchlaufen und schließlich eine sehr negative Zahl zurückgeben (sofern b selbst sehr negativ ist, in welchem ​​Fall, abhängig vom Wert a, die Funktion könnte für immer loopen).

und diese gegeben, können wir daraus schließen, dass das Verhalten mit Null und negativen Zahlen bizarr genug, dass das Verfahren wahrscheinlich mit positiven Zahlen verwendet wird eigentlich nur dazu gedacht ist. So kann ihr Verhalten zusammengefasst werden:

  • Wenn a und b beide positiv sind, dann ist die Methode, die am wenigsten positive ganze Zahl zurückgibt, die zu a Modulo b deckungsgleich ist.

Wenn die obige Schlussfolgerung richtig ist, dann kann das Verfahren neu geschrieben werden als:

public int question_1(int a, int b) { 
    if (a <= 0 || b <= 0) 
     throw new IllegalArgumentException(); 
    return (a - 1) % b + 1; 
} 
+0

a == 0 ist wahrscheinlich eine gültige Eingabe –

+0

@MattTimmermans: Denkst du? Das erscheint mir unwahrscheinlich - wenn "0" ein gültiges Ergebnis ist, warum gibt es dann "b" statt "0" zurück, wenn "a" ein Vielfaches von "b" ist? - Aber ich denke, wir können es nicht sicher wissen. (Daher mein erster Absatz. :-P) – ruakh

1

Ich würde vermuten, dass ihr Zweck ein% b für positive ints zu berechnen ist, und dass es einen Fehler hat .

Wenn ich dies in der Produktion sah, würde ich die Verwendung dieser Funktion überprüfen müssen, um zu sehen, ob Frage_1 (n, n) == n ist wirklich richtig. Wenn ja, würde ich einen Kommentar hinzufügen, der angibt, warum das so ist. Sonst würde ich es reparieren.

In jedem Fall könnte es umgeschrieben werden, den Operator% anstelle einer Schleife zu verwenden. Wenn es richtig ist, könnte es wie folgt neu geschrieben werden:

public int question_1(int a, int b) 
{ 
    if (a>b) 
    { 
     a = ((a-1)%b) + 1; 
    } 
    return a; 
} 

Dies ist im Umgang mit negativen Zahlen nicht gleich ist, obwohl, so wieder würden Sie überprüfen, um sicherzustellen, das ist OK.

Der Grund, warum ich diese Antwort gebe, wenn @ruakh solch eine sorgfältig durchdachte Antwort gegeben hat, ist, dass es eine Interviewfrage ist, also ist es am besten, wenn Sie die Gelegenheit nutzen, um zu zeigen, wie Sie ein solches Problem angehen würden .

Sie möchten nicht wirklich den Eindruck erwecken, dass Sie eine lange Zeit und viel Mühe darauf verwenden würden, sorgfältig über ein so einfaches Problem nachzudenken - wenn Sie so viel Aufwand aufwenden müssen, um ein einfaches Problem zu lösen Was würdest du für einen großen ausgeben?

Gleichzeitig möchten Sie zeigen, dass Sie den möglichen Fehler erkennen, und die Initiative ergreifen, um es zu beheben oder zukünftigen Ingenieuren die gleiche Aufgabe zu ersparen.

Verwandte Themen