试图在包含负数的二进制表示中找到1的最大长度。在以下代码中input_file
是一个文本文件,其中:
示例文件:
4-样本数量
3-样本
0-
1-
2-
结果:2
任务:打印输入文件中所有样本整数中找到的最大整数数。找到需要O(n)时间且只需一次通过所有样本的解决方案
如何修改解决方案以处理任意大小的负整数(或至少针对n ≤ 10000
)呢
更新:
据我所知,负数的二进制表示是基于二的补码(https://en.wikipedia.org/wiki/Two的_补码)。例如:
+3->;011
-3->;101
在一般情况下,如何将整数转换为二进制字符串表示,并考虑其符号
def maxConsecutive(input):
return max(map(len,input.split('0')))
def max_len(input_file):
max_len = 0
with open(input_file) as file:
first_line = file.readline()
if not first_line:
return 0
k = int(first_line.strip()) # number of tests
for i in range(k):
line = file.readline().strip()
n = int(line)
xs = "{0:b}".format(n)
n = maxConsecutive(xs)
if n > max_len:
max_len = n
return max_len
print(max_len('input.txt'))
更新2: 这是Yandex竞赛培训页面的第二项任务: https://contest.yandex.ru/contest/8458/enter/?lang=en
您需要在那里注册以测试您的解决方案
到目前为止,这里给出的所有解决方案都在测试9中失败
更新3:Haskell中通过所有Yandex测试的解决方案
import Control.Monad (replicateM)
onesCount :: [Char] -> Int
onesCount xs = onesCount' xs 0 0
where
onesCount' "" max curr
| max > curr = max
| otherwise = curr
onesCount' (x:xs) max curr
| x == '1' = onesCount' xs max $ curr + 1
| curr > max = onesCount' xs curr 0
| otherwise = onesCount' xs max 0
getUserInputs :: IO [Char]
getUserInputs = do
n <- read <$> getLine :: IO Int
replicateM n $ head <$> getLine
main :: IO ()
main = do
xs <- getUserInputs
print $ onesCount xs
对于负数,您必须决定字长(32位、64位……),或将其作为绝对值处理(即忽略符号),或为每个值使用最小位数
控制字长的一种简单方法是使用格式字符串。通过将值与所选字大小对应的幂2相加,可以获得负位。这将为正数和负数提供适当的位
例如:
计算连续1的最长序列只需处理字符串操作:
如果您选择使用不同的字号来表示负数,则可以使用比正数的最小表示多一点的字号。例如,-3在为正数时表示为两位('11'),因此至少需要3位才能表示为负数:“101”
假设
OP需要2的二进制补码
这导致:
所以为了消除无限精度的影响,我们可以显示2对固定位数的补码。此处使用16,因为OP提到的数字是<;10, 000.
使用2的补码的示例
测试代码
测试输出
代码
最大长度的代码简化
最大长度可以减少到:
相关问题 更多 >
编程相关推荐