繁体   English   中英

使用python翻转数组中的位

[英]Flip bits in array using python

您将获得一个包含N元素的整数数组: d[0], d[1], ... d[N - 1] 您可以在阵列上执行AT MOST一次移动:选择任意两个整数[L, R] ,并翻转(包括)第L和第R位之间的所有元素。 LR表示标记您决定翻转的段的边界的位的最左侧和最右侧索引。

在最终的位串中可以获得的最大1位数(由S表示)是多少?

“翻转”意味着将0转换为1并将1转换为00->1 1->0 )。

输入格式:整数N ,下一行包含N位,用空格分隔: d[0] d[1] ... d[N - 1]

输出: S

约束:

1 <= N <= 100000,
d[i] can only be 0 or 1 ,
0 <= L <= R < n ,

样本输入:

8

1 0 0 1 0 0 1 0 

样本输出: 6

说明:

通过执行以下任一操作,我们可以在给定的二进制数组中最多获得6个:

Flip [1, 5] ==> 1 1 1 0 1 1 1 0

清理并制作Pythonic

arr1 = [1, 0, 0, 1, 0, 0, 1, 0]
arr2 = [1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]
arr3 = [0,0,0,1,1,0,1,0,1,1,0,0,1,1,1]


def maximum_ones(arr):
    """
    Returns max possible number of ones after flipping a span of bit array
    """  

    total_one = 0
    net = 0
    maximum = 0
    for bit in arr:
        if bit:
            total_one += 1
            net -= 1
        else:
            net += 1
        maximum = max(maximum, net)
        if net < 0:
            net = 0
    return total_one + maximum

print(maximum_ones(arr1))
print(maximum_ones(arr2))
print(maximum_ones(arr3))

输出:

6
14
11

如果我们想要L和R指数

这个不太确定。 它可能会变得更干净。

arr1 = [1, 0, 0, 1, 0, 0, 1, 0]
arr2_0 = [1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]
arr2_1 = [1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]
arr2_2 = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]
arr3 = [0,0,0,1,1,0,1,0,1,1,0,0,1,1,1]


def maximum_ones(arr):
    """
    Returns max possible number of ones after flipping a span of bit array
    and the (L,R) indices (inclusive) of such a flip
    """ 
    total_one = 0
    net = 0
    maximum = 0
    L = R = 0
    started_flipping = False
    for i, bit in enumerate(arr):
        if bit:
            total_one += 1
            net -= 1
        else:
            net += 1
            if not started_flipping:
                started_flipping = True
                L = i
        if net > maximum:
            maximum = net
            R = i
        if net < 0:
            net = 0
            if i < R:
                L = i
    return (total_one + maximum, (L,R))

print(maximum_ones(arr1))
print(maximum_ones(arr2_0))
print(maximum_ones(arr2_1))
print(maximum_ones(arr2_2))
print(maximum_ones(arr3))

输出:

(6, (1, 5))
(14, (1, 16))
(14, (2, 16))
(14, (3, 16))
(11, (0, 2))

第一次迭代

如果你想看到思维过程的演变,这就是我原来的样子。 在这里,我基本上是在纸上写出了我想出的东西。

本质上,我们遍历数组并开始翻转位(确定,不是真的),跟踪累积翻转的零和两个单独数组中的累积翻转的数据以及整数计数器中的总翻转数。 如果在给定索引处翻转的1和0之间的差异 - “净” - 降至零以下,我们将该累积计数重置为该索引处的零(但没有别的)。 在此过程中,我们还会跟踪我们实现的最大净值以及发生的最大值。 因此,总数只是我们看到的总数1加上最大指数的净值。

arr = [1, 0, 0, 1, 0, 0, 1, 0]
total_one = 0
one_flip =  [0 for _ in range(len(arr))]
zero_flip = [0 for _ in range(len(arr))]

# deal with first element of array
if arr[0]:
    total_one += 1
else:
    zero_flip[0] = 1

maximum = dict(index=0,value=0) #index, value
i = 1
# now deal with the rest
while i < len(arr):
    # if element is 1 we definitely increment total_one, else, we definitely flip
    if arr[i]:
        total_one += 1
        one_flip[i] = one_flip[i-1] + 1
        zero_flip[i] = zero_flip[i-1]
    else:
        zero_flip[i] = zero_flip[i-1] + 1
        one_flip[i] = one_flip[i-1]

    net = zero_flip[i] - one_flip[i]
    if net > 0:
        if maximum['value'] < net:
            maximum['value'] = net
            maximum['index'] = i
    else: # net == 0, we restart counting our "net"
        one_flip[i] = 0
        zero_flip[i] = 0

    i += 1

maximum_flipped = total_one - one_flip[maximum['index']] + zero_flip[maximum['index']]

结果:

print(total_one, -one_flip[maximum['index']], zero_flip[maximum['index']] )
print(maximum_flipped)
print('________________________________________________')
print(zero_flip, arr, one_flip, sep='\n')
print('maximum index', maximum['index'])

输出:

3 -1 4
6
________________________________________________
[0, 1, 2, 2, 3, 4, 4, 5]
[1, 0, 0, 1, 0, 0, 1, 0]
[0, 0, 0, 1, 1, 1, 2, 2]
maximum index 5

如果

arr = [1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]

6 -4 12
14
________________________________________________
[0, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 12]
[1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1]
[0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5]
maximum index 16

最后,如果

arr = [0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]

8 0 3
11
________________________________________________
[1, 2, 3, 3, 3, 4, 4, 5, 5, 0, 1, 2, 2, 0, 0]
[0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1]
[0, 0, 0, 1, 2, 2, 3, 3, 4, 0, 0, 0, 1, 0, 0]
maximum index 2

好的,现在撕裂它们,人们!

遍历整个阵列。 保持一个count的方式如下:

  • 遇到每0位都要+1

  • 每1做-1

如果此计数在任何阶段达到-ve,则将其重置为0.跟踪此countmax 将此max_count添加到输入数组中的1's数字。 这将是你的答案。

码:

arr = [1, 0, 0, 1, 0, 0, 1, 0]
# I'm taking your sample case. Take the input the way you want

count,count_max,ones = 0,0,0

for i in arr:
    if i == 1:
        ones += 1
        count -= 1
    if i == 0:
        count += 1
    if count_max < count:
        count_max = count
    if count < 0:
        count = 0

print (ones + count_max)

小而简单:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM