最大相邻位数仅翻转一个

时间:2014-08-28 08:46:09

标签: debugging language-agnostic pseudocode

这个问题出现在面试前的在线编码测试中。我试图彻底改变这种情况&任何无关紧要的信息,以避免任何人参加该测试找到这篇文章。

问题涉及一串字节。如果您可以翻转一位,则会要求您找到相邻对的最大计数。

即如果你翻转第二位,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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

要查找错误或利用我可能会首先尝试理解代码:

第一个循环计算t

中序列中的对数(“00”或“11”)
for i 0..(l-2):
    if A[i] = A[i+1]:
        t += 1

然后第二个循环查找特定序列:

  1. “101”或“010”,然后c = 2
  2. “01”或“10”,然后c = 1(仅在查看第一位或最后一位时)
  3. 其他序列c = 0或-1或-2
  4. 并在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()它。