要将一个由0和1组成的数组分成三个非空的部分,使得所有这些部分表示相同的二进制值,可以采用以下步骤:
计算数组总和:
首先,计算数组中1的总数。如果1的总数不能被3整除,那么无法将数组分成三个表示相同二进制值的部分,返回`[-1, -1]`。
确定每个部分的1的数量:
如果1的总数能被3整除,那么每个部分应该包含相同数量的1。计算每个部分应该包含的1的数量,即`total_ones / 3`。
遍历数组:
遍历数组,计算前两个部分中1的数量,直到达到每个部分应该包含的1的数量。记录下第一个部分的结束位置`first_part_end`。
检查第二部分:
从`first_part_end`开始继续遍历数组,计算第二个部分中1的数量,直到达到每个部分应该包含的1的数量。记录下第二个部分的结束位置`second_part_end`。
验证第三部分:
从`second_part_end`开始遍历数组,计算第三个部分中1的数量,直到数组结束。如果第三个部分的1的数量等于每个部分应该包含的1的数量,则返回`[first_part_end, second_part_end]`。
返回结果:
如果三个部分的1的数量都相等,则返回相应的分割点;否则,返回`[-1, -1]`。
```python
def three_equal_parts(arr):
total_ones = arr.count('1')
if total_ones % 3 != 0:
return [-1, -1]
target_ones = total_ones // 3
first_part_end = -1
second_part_end = -1
current_ones = 0
for i, bit in enumerate(arr):
if bit == '1':
current_ones += 1
if current_ones == target_ones + 1:
first_part_end = i
elif current_ones == 2 * target_ones + 1:
second_part_end = i
if first_part_end == -1 or second_part_end == -1:
return [-1, -1]
third_part_ones = total_ones - (first_part_end + 1 + second_part_end + 1)
if third_part_ones != target_ones:
return [-1, -1]
return [first_part_end, second_part_end + 1]
示例
print(three_equal_parts([1,0,1,0,1])) 输出: [0, 3]
print(three_equal_parts([1,1,0,1,1])) 输出: [-1, -1]
print(three_equal_parts([1,1,0,0,1])) 输出: [0, 2]
```
这段代码首先计算数组中1的总数,然后找到每个部分应该包含的1的数量,并通过遍历数组来确定每个部分的结束位置。最后,验证第三个部分的1的数量是否等于每个部分应该包含的1的数量,以确定是否可以将数组分成三个表示相同二进制值的部分。