这个问题出现在面试前的在线编码测试中。我试图彻底改变这种情况&任何无关紧要的信息,以避免任何人参加该测试找到这篇文章。
问题涉及一串字节。如果您可以翻转一位,则会要求您找到相邻对的最大计数。
即如果你翻转第二位,101110将有4个相邻的对。
我获得了似乎可以解决问题的代码,并通过更改最多三行来解决问题。不幸的是我无法找到错误。一段时间以来我一直很沮丧..
提供的代码(编译并运行提供的示例)
int sol(int[] Arr):
int l = len(Arr)
int t = 0
for i 0..(l-2):
if A[i] = A[i+1]:
t += 1
int r = 0
for i 0..(l-1):
int c = 0
if i > 0:
if A[i-1] != A[i]:
c++
else:
c--
if i < (l-1):
if A[i+1] != A[i]:
c++
else:
c--
r = Max(r, c);
return t+r
有什么想法吗?
答案 0 :(得分:0)
要查找错误或利用我可能会首先尝试理解代码:
第一个循环计算t
中序列中的对数(“00”或“11”)for i 0..(l-2):
if A[i] = A[i+1]:
t += 1
然后第二个循环查找特定序列:
并在r中保持c和r之间的较高值,因此c小于0的任何值都无关紧要。
int r = 0
for i 0..(l-1):
int c = 0
if i > 0:
if A[i-1] != A[i]:
c++
else:
c--
if i < (l-1):
if A[i+1] != A[i]:
c++
else:
c--
r = Max(r, c);
要查找错误,您可以简单地利用解析长“11001100110011001100 ...”序列的第一个循环,当实际值应为2时,您会发现序列长度的一半除以2的值。
这可能只是半答案,因为我找不到只修改3行的修正,但是当你更改代码时,你也改变了一些指令所采用的行数或几行的顺序。
我觉得修复涉及合并两个循环并在最大值中使用t进行少量其他更改,但它会使更多3行更改。
答案 1 :(得分:0)
这是因为邻接量可能下降。例如:(0,0,0,0,0,0)。这是5个附属品。如果您翻转它们中的任何一个,金额会下降到4,但您提供的算法只允许金额上升,因为c
的起始值为零,您是max()
它。