要找到整数的数字硬度,请使用二进制表示形式,并计算可以删除前导和尾随的次数,
1
直到它以a开头或结尾为止0
。去除的总位数是其数字硬度。
这是一个冗长的解释-因此,让我们用一个可行的例子来分解它。
在此示例中,我们将使用数字3167。在二进制文件中,这是:
110001011111
(请注意,在转换为二进制文件的过程中,应确保去除前导零)
它不是以开头或结尾0
,因此我们删除了1对位:
1 1000101111 1
还有一个:
11 00010111 11
但是现在开始时有一个0,所以我们不能再删除1
对了。总共4个比特我们除去,所以4是数字硬度3167。
但是,对于可以写为2 n -1表示正n的数字(即仅包含1
二进制表示形式),永远不会达到0,因此可以删除所有位。这意味着硬度只是整数的位长。
挑战
您的任务是编写一个程序或函数,给定一个非负整数n >= 0
,该程序或函数将确定其数字硬度。
您可以提交执行I / O的完整程序,或提交返回结果的功能。您的提交应适用n
于您的语言的标准整数范围内的值。
测试用例
如果其中任何一个不正确,或者您想建议添加任何极端情况,请通知我。
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
这是我用来生成这些测试用例的非解决方法(不保证没有错误):
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
没有0
任何内容时如何返回1 ?我的意思是,您不可能从字符串中删除足够多的1来使其开始或结束于0
。