【问题标题】:How do I check if 1 is always followed by a 0如何检查 1 后面是否总是跟着 0
【发布时间】:2020-03-25 07:00:30
【问题描述】:

Python 中,我找不到关于如何确定数字列表中某处的 1 后面是否总是有 0 以形成一对 10 的解决方案>。它不一定是直接追随者。

为了清楚起见,我的意思是“列表”就像(某种)二进制数,具体来说,

1100  #pass
1001  #fail
1010  #pass
0101  #fail

11110000  #pass
11100001  #fail

11100100  #pass

在 0 之前必须始终有相同数量的 1。 提前致谢。

【问题讨论】:

  • 你试过什么?可以分享一下吗?
  • 试着想想这个设置背后的逻辑。做一次尝试。到目前为止你有没有尝试过?
  • alwayssomewhere是什么意思,在第一种情况下,1不是always后跟a 0. 只有第二种情况会通过过滤器。
  • if '10' in sif '10' in bin(s) 怎么样
  • 我想出的唯一合理的解决方案是比较从头到尾的值,直到匹配到 1 和 0,然后从列表中删除并重复。

标签: python python-3.x list binary


【解决方案1】:

保留一个临时变量,初始化为0。为每个1 增加它,否则减少它。 它不应该是负数,并且为了确保10 一样多,最后它应该等于0

def check(bits):
    temp = 0
    for bit in bits:
        if temp < 0:
            return False
        if int(bit) == 1:
            temp += 1
        else:
            temp -= 1
    return temp == 0

举个例子:

>>> check('1100')
True
>>> check('110001')
False
>>> check('1')
False
>>> check('10')
True
>>> check('1010')
True
>>> check('123')
False

【讨论】:

  • 顺便问一下,你是怎么想出来的?
  • @AlexanderCécile:我已经编程了 30 年。 :D 但大多数情况下,它看起来像是确定括号和括号是否为balanced 的更简单版本:{({})[](())}。为此您需要一个堆栈,但由于只有一种类型的“括号”,您只需要知道堆栈是否为空。所以你可以用一个简单的计数器来替换堆栈。
【解决方案2】:

我的解决方案只是使用嵌套的 for 循环。无需导入模块:)

1 - 用于测试列表中每个数字的外部 for 循环

2 - 内部 for 循环用外部循环中的数字测试列表中的其他数字

binary = list("0100")
result = "Fail"


for idxNumber, number in enumerate(binary):
    for idxOtherNumbers, otherNumbers in enumerate(binary):
        if int(number) == 1:
            if int(otherNumbers) == 0 and idxOtherNumbers > idxNumber:
                result = "Pass"
            elif int(otherNumbers) == 1 and idxOtherNumbers > idxNumber:
                result = "Fail"
print(result)

【讨论】:

  • 为什么所有演员表都使用int()?为什么将该字符串转换为列表?您的continue 声明似乎没有必要。
  • 使用 int() 因为 list("0100") 以字符串格式创建数字列表。感谢您指出继续声明。我修复了代码。
  • 是的,我的观点是没有理由想要一个整数列表而不是一个字符串。您的程序根本没有利用它们是整数这一事实。
  • @AlexanderCécile 转换为 int 的优点是代码现在接受字符串或 int 列表。
  • @EricDuminil 我没想到,我想这是一个不错的奖励。
【解决方案3】:
cases = ['0111', '1100','1001','1010','0101','11110000','11100001','11100100', '11100000', '11000110']

def check(s):
    cnt_0, cnt_1 = sum(ch == '0' for ch in s), sum(ch == '1' for ch in s)
    if cnt_0 != cnt_1:
        return False
    i1 = (v[0] for v in enumerate(s) if v[1] == '1')
    i2 = (v[0] for v in enumerate(s) if v[1] == '0')
    for idx1, idx2 in zip(i1, i2):
        if (idx2 < idx1):
            return False
    return True

for case in cases:
    print(case, check(case))

打印:

0111 False
1100 True
1001 False
1010 True
0101 False
11110000 True
11100001 False
11100100 True
11100000 False
11000110 False

【讨论】:

  • 它在许多其他情况下不起作用。例如,对于 11100100 应该返回 True,但它不会
  • @igor 为什么11100100 返回True?最后只有一个1,后跟两个00...
  • 因为如果你把它分解,你会得到 11100100, 11100100、11100100 最后是 11100100
  • 现在 11100000 过去了,即使它不应该 :DI 只是无法绕开它,这似乎很容易,但我无法想出任何功能......随意放弃它,不过还是谢谢
  • 就像一场噩梦,不知为何只剩下11000110了
【解决方案4】:
import re

def is_good(n):
    n = n[2:]
    length = 0
    if re.search(r'.*1+$', n):
        return False;

    for i, b in enumerate(n):
        if b == '1':
            length += 1
        else:
            if len(n) - i < length:
                return False
            else:
                if length != 0:
                    if n[i:i + length] != '0' * length:
                        return False
                    length = 0
    return True


print((is_good('1b11100001')))
print((is_good('1b11100000')))
print((is_good('1b1100')))
print((is_good('1b1101')))
print((is_good('1b1010')))
print((is_good('1b0101')))
print((is_good('1b0111')))

【讨论】:

  • 给函数命名 len 是个坏主意。你为什么要n.__len__()
【解决方案5】:

这是一个 NumPy 方法,附带将字符串转换为数组的实用函数。

import numpy as np

def nums_str_to_ndarr(str_in: str) -> np.ndarray:
    return np.fromiter(str_in, dtype=int, count=len(str_in))


def valid_ones_arr(nums_arr: np.ndarray) -> bool:
    nums_arr[nums_arr == 0] = -1
    nums_arr = np.cumsum(nums_arr)
    return np.all(nums_arr >= 0) and (nums_arr[-1] == 0)

我将在寻找更好的解决方案时将其用作基准/标准。当然欢迎大家也这样做:)

【讨论】:

  • @EricDuminil Tbh 我以为我做了一些更改,但我可能正在考虑一个没有成功的不同功能。对不起D:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多