将1位的数量加倍,而不是一次只加一个:
def repeatdigit(length:int, distance:int) -> int:
def f(want):
if want == 1:
return 1
have = (want + 1) // 2
x = f(have)
add = min(have, want - have)
return x | (x << (add * distance))
ones = 1 + (length - 2) // distance
return f(ones)
我的
ones
,
want
,
have
和
add
请参考1位的数字。
这个
add = min(have, want - have)
正如我补充的那样,可以“简化”
有
或
have - 1
1比特。它来自这个较早的、稍微不太理想的版本:
def repeatdigit(length:int, distance:int) -> int:
result = 1
want = 1 + (length-2) // distance
have = 1
while have < want:
add = min(have, want - have)
result |= result << (add * distance)
have += add
return result