双指针判断是否循环
def circularArrayLoop(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
def next(i): #因为移动的步数是在nums里的,计算移动后的位置
return (i + nums[i])%len(nums)
for i in range(len(nums)): #起点可能是任意位置
slow,fast = i,next(i) #初始化双指针
while nums[i] * nums[fast] > 0 and nums[i] * nums[next(fast)] > 0: #确定移动的方向一直是一个,这里必须用走在前面的指针。且由于fast一次走两步,所以要判断它不停的那个地方也是方向一致的
if slow == fast:
if slow == next(slow): #相遇时还要判断一下循环的长度不能是1
break
return True #符合条件返回
slow = next(slow)
fast = next(next(fast))
return False