- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了这个任务并完全坚持其解决方案。
给出一个由 Q 个字符组成的非空零索引字符串 S。该字符串的周期是最小正整数 P,使得:
P ≤ Q/2 且 S[K] = S[K+P](0 ≤ K < Q − P)。
例如,7 是“abracadabracadabra”的句点。如果 M 是 N 的二进制表示的周期,则正整数 M 是正整数 N 的二进制周期。
例如,1651 的二进制表示为“110011100111”。因此,它的二进制周期是 5。另一方面,102 没有二进制周期,因为它的二进制表示形式是“1100110”并且没有周期。
考虑上述场景并在 Python 中编写一个函数,该函数将接受整数 N 作为参数。给定正整数 N,该函数返回 N 的二进制周期,如果 N 没有二进制周期,则返回 -1。
所附代码在某些输入(9、11、13、17 等)上仍然不正确。目标是发现并修复实现中的错误。您最多可以修改 2 行。
def binary_period(n):
d = [0] * 30
l = 0
while n > 0:
d[l] = n % 2
n //= 2
l += 1
for p in range(1, 1 + l):
ok = True
for i in range(l - p):
if d[i] != d[i + p]:
ok = False
break
if ok:
return p
return -1
最佳答案
我在面试中得到了这段代码。
练习的目的是找出错误所在。
作为函数的输入,您将键入整数以查看其二进制周期。例如,solution(4)
将为您提供二进制数 0011
。
但是,问题如下:错误是什么?
这种情况下的错误不是某些崩溃和烧毁代码,而是应该发生但在代码中没有发生的行为。
它被称为 logical error在代码中。逻辑错误是指代码没有破坏但没有满足要求时的错误。
对代码使用暴力是没有帮助的,因为有十亿种可能性。
但是,如果您运行代码,假设从 solutions(1)
到 solutions(100)
,您将看到代码运行时没有任何故障。然而,如果您查看代码,如果有错误,它应该返回 -1
。
即使您对更大的数字(例如 10000)运行解决方案,代码也不会给出任何 -1
。
这里的bug在于-1没有被触发。
那么让我们一步一步地讨论代码。
可能是while
部分吗?
while n > 0:
d[l] = n % 2
n //= 2
l += 1
如果你看一下代码,它正在做它应该做的事情,将给定的数字更改为二进制数,即使它是从向后的位置做的。您没有 1011
,而是 1101
,但它可以完成这项工作。
问题就在于那部分
for p in range(1, 1 + l):
ok = True
for i in range(l - p):
if d[i] != d[i + p]:
ok = False
break
if ok:
return p
return -1
它没有返回-1
。
如果你在代码的某些部分像这样打印一些内容,就会得到这个
for p in range(1, 1 + l):
ok = True
for i in range(l - p):
print('l, which works as an incrementor is substracted to p of the first loop',p,l-p)
if d[i] != d[i + p]:
ok = False
break
if ok:
return p
return -1
如果你运行整个脚本,实际上,你可以看到它永远不会结束,即使d[i]
不再等于d[i+p]
.
但是为什么呢?
原因是因为增量器 l 是基于整数除法构建的。因此,您需要执行 1+l//2
。
这将为您提供以下内容
def solution(n):
d = [0] * 30
l = 0
while n > 0:
d[l] = n % 2
n //= 2
l += 1
for p in range(1, 1 + l//2): #here you put l//2
ok = True
print('p est ',p)
for i in range(l - p):
if d[i] != d[i + p]:
ok = False
break
if ok:
return
现在,如果您使用 solutions(5)
运行代码,则错误应该已修复,并且您应该得到 -1
。
附录:
这个测试是一项困难的测试,算法不容易在很短的时间内处理,而且变量没有任何意义。
第一步是提出以下问题:
-1
这些分步 ( heuristic ) 将为您指明调试问题的正确方向。
关于python - 修复 "Binary period"的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57143272/
我写了一个 mdx 脚本来显示 Internet Sales Amount 的周期增长,一切正常。我们正在使用一个界面,您可以在其中放置一个切片器,以便用户可以选择他感兴趣的 date.Calenda
我有一列数据,例如 '1971q1'、'1972q2' 等(年份后跟季度)当我这样做时: print(type(df.Quarterly)) 答案是系列 我需要的是将此列“转换”/转换为真正的 pd.
下面是我要处理的句子。它由前面以两个哈希值 (##2312435) 开头的 ID 以及其余文本组成。我需要一个正则表达式来查找其中包含单词 likely 的句子,并检索整个句子和 ID。 句子: ##
这两条线有什么区别? call apoc.periodic.iterate("MATCH (n:Nodes) return n", "DETACH DELETE n", {batchSize:1000
这个问题在这里已经有了答案: When does Thread.CurrentThread.Join() make sense? (6 个答案) 关闭 9 年前。 有人可以向我解释 Thread.S
我正在尝试用 java.time 替换 org.joda.time.Period。 我们在数据库中存储了以下值。 P1M, P1Y, P1D, PT1H, PT1M 只是解析这个值: Period m
我正在尝试解析 linux dig 的输出使用正则表达式在一次拍摄中执行多项操作。 假设我挖掘主机 mail.yahoo.com : /usr/bin/dig +nocomments +noquest
我正在尝试创建一个匹配以下内容的正则表达式: 一个或多个数字 允许在第一个数字后有 0 到 1 个句点 如果有句号 句点后需要 1 - 2 位数字 这是我目前使用的正则表达式,它并不适用于所有情况:
这是我的代码。我想绘制美国东部夏令时9:30-10点的最高点和最低点。我破解了这个代码,但我搞不清时间了。只有当我将其设置为0800-0900时才有效,这没有任何意义。如果我把它设置为0930-100
我正在制作一个仅用于学习目的的应用程序。我试图计算两个日期之间的差异 LocalDate today = LocalDate.now(); LocalDate localHoudbaarheid =
我正在使用 SEO 友好的 URL,我可以通过 ASP.NET 处理其中的大部分,通过将 aspnet_isapi.dll 映射到所有 URL。 (我在 IIS 中设置了一个处理程序映射,它对所有路径
我准备了以下数据 Timestamp Weighted Value SumVal Group 1 1600 800 1 2
为什么结果为periodBetween.Days和 substracted.Days不同的? 我可以看到一个 periodBetween.Months是 0 和 substracted.Months是
我有生日和第二个 LocalDate.now()我使用 Periof 打印这个 Period test = Period.between(dateofbirth,LocalDa
我使用 cocoa 在 Mac 上开发了一个应用程序。我需要将 cmd + period(.) 键盘事件作为我设计的命令来处理。但现在 cmd + period(.) 键盘事件没有像我预期的那样得到很
我有4000个观测值的数据,所以这是head(both): kön gdk age fbkurs pers stterm 1 man
我有一个包含特定类元素 vector 的类。主要思想是根据序列的一个周期(elems_)和周期数(nperiod_)生成元素的周期性序列,因此我不需要存储所有元素,而只需存储一个周期。 class P
我正在尝试添加句点“。”以及变量的后缀“-on”(下面第 4 行): function globalProducts(cat, self){ $("div.info").hide();
例如: requests.get() 是一个带有句点的函数。我如何制作自己的函数,例如: def foo(): return 'bar' 并像这样调用该函数: x.foo() 不是这样的: f
我尝试使用java.time.Period,结果与我手动计算的结果相差了三天。这里奇怪的是,当我将时间段分为两个时间段时,结果与我的手动计算相符。 第二种方法就像我手动计算周期一样。 我是不是漏掉了什
我是一名优秀的程序员,十分优秀!