【问题标题】:function that checks the length of the cycle检查循环长度的函数
【发布时间】:2015-07-17 02:09:39
【问题描述】:

大家好,我有这个功能,但是当我测试它时它给了我错误。 有没有人对如何解决它有任何想法 这是我的练习。请仔细阅读。

编写一个函数cycleLength(array),它返回形成一个循环的学生人数,假设你从与最左边的人交谈开始。输入数组是一个非负整数列表,因此 array[m] 是学生 m 重定向到的学生的编号。没有学生重定向到自己。最左边的学生是 0 号,下一个是 1 号,依此类推。列表中的每个元素都在 [0, n-1] 范围内,其中 n 是列表的长度。 例如,假设列表是 [1, 3, 0, 1]。然后学生 0 重定向到学生 1,学生 1 重定向到学生 3,学生 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

【问题讨论】:

  • 如果有多个不同尺寸的循环怎么办?
  • 你忘记了循环末尾的i += 1 ;)
  • 错误是什么?请edit 您的问题在问题本身中包含错误或回溯的完整文本,而不是在 cmets 中。还请给出示例输入、预期输出和您得到的实际输出。我们不是读心者,你必须告诉我们哪里出了问题。

标签: python list function python-2.7 cycle


【解决方案1】:

你几乎猜对了。

>>> 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)

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

【讨论】:

  • 问题,当我输入一个负数时,它应该返回 false。有什么想法吗?
  • if current in seen之前,你可以简单地做if current < 0: return...
【解决方案2】:
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. 最后,循环的长度介于元素第一次出现到下一次迭代相同元素之间。而且它不一定从列表的开头开始。

更正:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2021-11-20
    • 2016-08-04
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多