检查周期长度的函数

时间:2015-07-17 02:09:40

标签: python list function python-2.7 cycle

嘿伙计们我有这个功能,但是当我测试它时它给了我错误。 有没有人对如何修复它有任何想法 这是我的练习。请仔细阅读。

编写一个函数cycleLength(array),它返回形成循环的学生数,假设你从最左边的那个开始。输入数组是非负整数的列表,因此array [m]是学生重定向的学生的编号。没有学生重定向到自己。最左边的学生是0,下一个是1,依此类推。列表中的每个元素都在[0,n-1]范围内,其中n是列表的长度。 例如,假设列表为[1,3,0,1]。然后学生0重定向到学生1,学生1重定向到学生3,重定向回学生1.有一个循环的两个学生:1,3。因此答案将是2.请注意,即使你开始与学生0,他不是循环的一部分。 这是我的功能:

def cycleLength(m):
    lst = []
    i = 0
    while i not in lst:
        lst.append(i)
        i = int(m[i])

    b = len(lst) - lst.index(i)
    return b

2 个答案:

答案 0 :(得分:3)

你几乎做对了。

>>> def cycleLength(students):
...     seen = []
...     current = 0
...     # Run till we have seen all the students
...     while len(seen) != len(students):
...         # If the current index has been seen already
...         if current in seen:
...             return len(seen) - seen.index(current)
...         seen.append(current)
...         current = students[current]
... 
>>> assert(cycleLength([1, 3, 0, 1]) == 2)
>>> assert(cycleLength([1, 3, 0, 2]) is None)

这将处理没有循环的情况。

答案 1 :(得分:1)

def cycleLength(m):
    lst = []
    for x in m:  
        if x in lst:
            return len(lst) - lst.index(x)
        lst.append(x)     

    return -1

<强>解释

  1. 你应该循环,而索引i m[i]的元素不在lst中 - 你在做什么就是在列表中寻找索引而不是“索引处的元素”
  2. 与上一点相同,你应该追加lst元素 - 而不是元素的索引 - 否则你将找不到任何这样的“重复”元素 - 因为索引应该只是增加。
  3. 关注最后一点 - 索引应该在每次迭代时不断增加
  4. 最后,循环的长度介于元素第一次出现到下次迭代同一元素的时间之间。并且必须从列表的开头。
  5. <强>校正:

    以前版本的代码有错误,同一个想法的更简单版本,并且也没有错误(我相信),在这里发布。 -1代表“没有找到循环”。