V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
meteor2013
V2EX  ›  程序员

请问如果快速找到相同值的子序列的位置?有什么好办法没有呢?

  •  1
     
  •   meteor2013 · 2015-11-01 11:10:45 +08:00 · 1817 次点击
    这是一个创建于 3316 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如:
    11111111000001111101111100000001111

    返回 7 个子序列,和他们的位置
    1, (1,8)
    2, (9,13 )
    3, (14,18)
    4, (19,19)
    5, (20,24)
    6, (25,31)
    7, (32,35)
    6 条回复    2015-11-02 01:09:36 +08:00
    llbbzh
        1
    llbbzh  
       2015-11-01 11:53:03 +08:00
    滑动窗口啊。
    设序列为 a ,指定两个指针 h ( head ), t ( tail ),规定区间[h,t]中的数字必须全部为某个值,设为 v
    为了让[h,t]中的数字全为 v ,显然初始时 h==t==1
    如果 a[t+1]==v ,那么 t++
    如果 a[t+1]!=v ,那么输出 h 和 t ,并令 v=a[t+1],h=t=t+1
    时间复杂度 O(n)
    Magic347
        2
    Magic347  
       2015-11-01 12:05:34 +08:00
    def find(s):
    ret = []
    if s is None or len(s) == 0:
    return ret
    start = 0
    curr = s[0]
    for i in range(0, len(s)):
    if s[i] != curr:
    ret.append((start+1, i))
    start = i
    curr = s[i]
    if i == len(s) - 1:
    ret.append((start+1, len(s)))
    else:
    if i == len(s) - 1:
    ret.append((start+1, len(s)))
    return ret


    算法上没有特别之处,只是处理一些边界 case 时要细致一些,提供一些测试用例

    find("")


    find("10")
    (1, 1)
    (2, 2)

    find("1111")
    (1, 4)

    find("1")
    (1, 1)

    find("11111111000001111101111100000001111")
    (1, 8)
    (9, 13)
    (14, 18)
    (19, 19)
    (20, 24)
    (25, 31)
    (32, 35)
    Magic347
        3
    Magic347  
       2015-11-01 12:21:38 +08:00
    这个回帖过滤代码缩进真是闹心啊,站主是不是可以考虑加一个代码缩进和高亮啊?

    def find(s):
    ____ret = []
    ____if s is None or len(s) == 0:
    ________return ret
    ____start = 0
    ____curr = s[0]
    ____for i in range(0, len(s)):
    ________if s[i] != curr:
    ____________ret.append((start+1, i))
    ____________start = i
    ____________curr = s[i]
    ____________if i == len(s) - 1:
    ________________ret.append((start+1, len(s)))
    ________else:
    ____________if i == len(s) - 1:
    ________________ret.append((start+1, len(s)))
    ____return ret
    meteor2013
        4
    meteor2013  
    OP
       2015-11-01 12:29:47 +08:00
    @Magic347 谢谢哥们啊,太贴心了
    话说代码缩进和高亮真的很有需要
    Slienc7
        5
    Slienc7  
       2015-11-01 13:56:10 +08:00
    menc
        6
    menc  
       2015-11-02 01:09:36 +08:00
    https://gist.github.com/PengFoo/51c0428fb67447abaf6a


    print find("10")
    print find("1111")
    print find("1")
    print find("11111111000001111101111100000001111")
    结果分别为:
    [(1, 1), (2, 2)]
    [(1, 4)]
    [(1, 1)]
    [(1, 8), (9, 13), (14, 18), (19, 19), (20, 24), (25, 31), (32, 35)]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:41 · PVG 07:41 · LAX 15:41 · JFK 18:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.