Aby znaleźć twardość cyfrową liczby całkowitej, weź jej reprezentację binarną i policz, ile razy wiodący i końcowy
1
można usunąć, dopóki nie zacznie się lub nie zakończy na0
. Całkowita liczba usuniętych bitów to jego twardość cyfrowa.
To dość dziwne wytłumaczenie - podzielmy to na działający przykład.
W tym przykładzie użyjemy liczby 3167. Binarnie jest to:
110001011111
(Należy pamiętać, że podczas konwersji na binarną należy pamiętać o usunięciu wiodących zer)
Nie zaczyna się i nie kończy 0
, więc usuwamy 1 parę bitów:
1 1000101111 1
I kolejny:
11 00010111 11
Ale teraz na początku jest 0, więc nie możemy już usunąć 1
par. W sumie usunęliśmy 4 bity, a więc 4 to twardość cyfrowa 3167.
Jednak w przypadku liczb, które można zapisać jako 2 n -1 dla dodatniej n (tj. Zawierają tylko 1
reprezentację binarną), 0 nigdy nie zostanie osiągnięte, więc wszystkie bity można usunąć. Oznacza to, że twardość jest po prostu liczbą bitową liczby całkowitej.
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która przy nieujemnej liczbie całkowitej n >= 0
określa jej twardość cyfrową.
Możesz przesłać pełny program wykonujący operacje we / wy lub funkcję zwracającą wynik. Przesłanie powinno działać w przypadku wartości n
mieszczących się w standardowym zakresie liczb całkowitych w Twoim języku.
Przypadki testowe
Powiadom mnie, jeśli któreś z nich są niepoprawne lub jeśli chcesz zasugerować jakieś przypadki brzegowe do dodania.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Oto nierozwinięte rozwiązanie Pythona, którego użyłem do wygenerowania tych przypadków testowych (nie ma gwarancji, że nie zawiera błędów):
def hardness(num) -> int:
binary = bin(num)[2:]
if binary.count('0') == 0:
return num.bit_length()
revbin = binary[::-1]
return min(revbin.find('0'), binary.find('0')) * 2
1
zwraca 1, gdy nie ma0
go w ogóle? Mam na myśli, że nie możesz usunąć wystarczającej liczby 1 z ciągu, aby rozpocząć lub zakończyć0
.