2016-09-05 1 views
-2

Ich habe ein Programm, in dem jede Binärzahl berücksichtigt wird und mit 1 Flip von 0 oder 1, wenn wir alle 0 oder 0 erhalten alle 1s, dann gibt es wahr zurück, sonst wird es falsch zurückgeben.Geben Sie true zurück, wenn eine Binärzahl entweder alle Null oder alle Einsen auf einer einzigen Spiegelung enthält. (Python)

Für z.B. 110 auf 1 Spiegelung von Element 0 gibt 111 zurück und es wird als wahr gedruckt. 111 ist eine Binärzahl, die auf einer Klappe als falsch gedruckt wird. Jede mögliche Lösung, wie man es löst?

Wir freuen uns auf die bestmöglichen Lösungen. Schätzen Sie, ob die Lösung mit Python geschrieben wurde.

Das habe ich tatsächlich gemacht.

def binary(num, length = 4): 
    return format(num, '#0{}b'.format(length + 2)).replace('0b', '') 
n = binary(125) 
n.count('0') 
n.count('1') 
if (n.count('0') == 1) or (n.count('1') == 1): 
    return true 

Eigentlich hatte ich keine Ahnung wie man es umdreht.

+3

Es ist wie Sie uns schreiben wollen, sieht etwas Code für dich. Während viele Benutzer bereit sind, Code für einen in Not geratenen Coder zu produzieren, helfen sie normalerweise nur, wenn das Poster bereits versucht hat, das Problem selbst zu lösen. Eine gute Möglichkeit, diesen Aufwand zu demonstrieren, besteht darin, den Code, den Sie bisher geschrieben haben, die Beispieleingabe (falls vorhanden), die erwartete Ausgabe und die Ausgabe, die Sie tatsächlich erhalten (Konsolenausgabe, Trace-Backs usw.), einzubeziehen. Je mehr Details Sie angeben, desto mehr Antworten erhalten Sie wahrscheinlich. Überprüfen Sie die [FAQ] und [fragen]. – idjaw

Antwort

2

Sie müssen also binäre Darstellung gegebene Zahl enthält nur eine „eins“ oder nur eine „Null“ festzustellen, ob?Es gibt wenig Trick zu finden Zahlen mit Single-Bit gesetzt:

if (x == 0) 
    return false 
if (x & (x - 1) == 0 
    return true 

Erläuterung: wenn die Zahl wie b00001000 aussieht, dann Abnahme gibt b00000111 und binäre und führt zu einem Null-Ergebnis

Zur Überprüfung Single-Null-Nummern nur invertieren sie

wenn kein ~ Operator (binär NOT) ist in Python, können Sie alle Bits Anzahl invertieren mit

x_inversion = -(x+1) 
+0

Invertieren der Nummer ist nicht so einfach wie es sein sollte (na ja, nicht in Python) ... verwendet den gleichen Trick in meiner Antwort, offensichtlich nur ein einziges Bit gesetzt bedeutet die Zahl ist ein Faktor von 2 – AChampion

+0

@AChampion aussehen bei meiner Lösung. Kann ich eine detaillierte Lösung mit einer besseren Erklärung erhalten? –

0

Sie können Schleife über die Werte von 0 bis log (x), wobei x die Ausgabe und xor mit 2 x die 100000 ist ... Dann überprüfen Sie einfach, ob das, was du hast 0 oder 2 x +1 -1. Es sollte gut funktionieren.

def g(x): 
    for i in range(int(log(x)/log(2))): 
     if x^2 ** i == 0 or x^2 ** i == 2 ** int(log(x)/log(2) + 1) - 1: 
      return True 
    return False 

Eine andere Lösung ist die binäre Auslegung der Zahl zu sortieren und überprüfen, ob diese nur eine 1 oder eine 0. Die einzige Lambda-Funktion unten geschrieben genau das tut. Seit bin() kehrt binär 0b gefolgt von der binären Interpretation der Zahl ich werde es los und dann entfernen Sie alle 0, um zu überprüfen, ob dort nur eine 1, der zweite Teil prüft das Gegenteil.

f = lambda x: len(str(bin(x))[2:].replace('0','')) == 1 or len(str(bin(x))[2:].replace('1','')) == 1 

Wenn x die binäre Interpretation der Zahl ist, sollten Sie diese verwenden:

f = lambda x: len(x.replace('0','')) == 1 or len(x.replace('1','')) == 1 
0

Eine mögliche Lösung:

erste Ziffer Get gegen alle anderen zu überprüfen, konvertieren stirng , weil Integer nicht iterierbar ist

first = str(number)[0] 

Schleife über alle von ihnen, Rückgabe True, wenn wir gehen durch die Schleife, falsch, wenn wir eine Ziffer finden, das nicht

for digit in str(number): 
    if digit == first: 
     continue 
    else: 
     return False 
return True 
0

Angenommen überein, dass die Flip zu jedem Bit der Zahl anwenden kann, können Sie nur das Auftreten von 1 oder 0 zählen Wenn entweder Ergebnis 1 zurückkehrt, dann ist die Antwort wahr ist, sonst ist die Antwort falsch:

def one_flip(i): 
    # i should be integer, so convert it to string using bin() and get the result excluding the '0b' 
    s = bin(i)[2:] 
    return s.count('0') == 1 or s.count('1') == 1 
0

Just for Laughs - mit einigen bitweise Manipulationen:

>>> def single_flip(n): 
... return any(x and not x & (x - 1) for x in [n, n^2**n.bit_length()-1])]) 
... 
>>> single_flip(0b1110111), single_flip(0b1010111), single_flip(0b0001000) 
(True, False, True) 

Diese prüft nur, ob die Anzahl oder sein bitweise Komplement (nicht 2-Komplement) ein Faktor 2 ist

Verwandte Themen