我有一个任务是获取字符串中相同数字的每次出现的距离,它的时间复杂性应该是O(N),所以它不应该使用嵌套的for循环.

例如,如果我的字符串包含"100101",并且我需要计算1之间的距离,那么总距离将是10.(因为第一个和第二个的距离为3,第一个和最后一个的距离为5,第二个和最后一个的距离为2).

我确实得到了使用嵌套for循环的正确答案,但我不明白如何在没有嵌套循环的情况下实现这一点.

我当前的代码:

def pairs(s):
    array = []
    total = 0

    for i in range(len(s)):
        if s[i] == "1":
            array.append(i)

    for k in reversed(array):
        array.remove(k)
        for j in reversed(array):
            total += k - j
        
    return total



if __name__ == "__main__":
    print(pairs("100101")) # 10
    print(pairs("101")) # 2
    print(pairs("100100111001")) # 71

推荐答案

这实际上可以用O(N)来计算(我采用了用于计算排序点的曼哈顿距离之和的classic 贪婪算法):

def pairs(numbers, target):
    result = s = i = 0
    for j, n in enumerate(numbers):
        if n == target:
            result += (j * i - s)
            s += j
            i += 1
    return result

下面是一些示例:

>>> pairs('100101', '1')
10
>>> pairs('100101', '0')
6
>>> pairs('100010101', '1')
26

Python相关问答推荐

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

Python -Polars库中的滚动索引?

Django管理面板显示字段最大长度而不是字段名称

如何过滤包含2个指定子字符串的收件箱列名?

OR—Tools CP SAT条件约束

joblib:无法从父目录的另一个子文件夹加载转储模型

如何从列表框中 Select 而不出错?

如何更改groupby作用域以找到满足掩码条件的第一个值?

try 检索blob名称列表时出现错误填充错误""

lityter不让我输入左边的方括号,'

如何在达到end_time时自动将状态字段从1更改为0

numpy.unique如何消除重复列?

为什么常规操作不以其就地对应操作为基础?

为什么Python内存中的列表大小与文档不匹配?

jsonschema日期格式

Pandas 数据帧中的枚举,不能在枚举列上执行GROUP BY吗?

如何将返回引用的函数与pybind11绑定?

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

有没有一种方法可以在朗肯代理中集成向量嵌入