python数组循环输入_457. 环形数组循环(Python)

题目

难度:★★★☆☆

类型:数组

方法:快慢指针

力扣链接请移步本题传送门

更多力扣中等题的解决方案请移步力扣中等题目录

给定一个含有正整数和负整数的环形数组 nums。 如果某个索引中的数 k 为正数,则向前移动 k 个索引。相反,如果是负数 (-k),则向后移动 k 个索引。因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一个元素,而第一个元素的前一个元素是最后一个元素。

确定 nums 中是否存在循环(或周期)。循环必须在相同的索引处开始和结束并且循环长度 > 1。此外,一个循环中的所有运动都必须沿着同一方向进行。换句话说,一个循环中不能同时包括向前的运动和向后的运动。

示例

示例 1:

输入:[2,-1,1,2,2]

输出:true

解释:存在循环,按索引 0 -> 2 -> 3 -> 0 。循环长度为 3 。

示例 2:

输入:[-1,2]

输出:false

解释:按索引 1 -> 1 -> 1 ... 的运动无法构成循环,因为循环的长度为 1 。根据定义,循环的长度必须大于 1 。

示例 3:

输入:[-2,1,-1,-2,-2]

输出:false

解释:按索引 1 -> 2 -> 1 -> ... 的运动无法构成循环,因为按索引 1 -> 2 的运动是向前的运动,而按索引 2 -> 1 的运动是向后的运动。一个循环中的所有运动都必须沿着同一方向进行。

提示:

-1000 ≤ nums[i] ≤ 1000

nums[i] ≠ 0

0 ≤ nums.length ≤ 5000

解答

环形数组的判断,建议使用快慢指针。

选取一个索引为起始位置,定义两个指针,慢指针slow每次走一步,快指针fast每次走两步,遍历过程中,查看能否相遇,如果可以相遇,则原数组可以组成环形数组循环。

这里需要注意的是两个特殊情况的判断,一个是快指针或慢指针遍历过程中所遇到的数字的符号需要一致,另一个是循环的长度必须大于1,这里循环的长度意思是慢指针走多少步可以回到最初的位置。

还有一点需要考虑的是,我们需要判断所有索引作为初始位置,只要有一个索引满足从该索引出发可以形成环形数组循环,直接返回True即可,这里需要注意是遇到的元素是0的情况,为了减少遍历,可以考虑将之前遍历走过的路程剔除出去,不需要再次考虑。

class Solution:

def circularArrayLoop(self, nums: List[int]) -> bool:

n = len(nums)

nxt = lambda x: (x + nums[x]) % n

for i in range(n):

if nums[i] == 0:

continue

slow = i

fast = nxt(i)

# 快慢指针

while nums[slow] * nums[nxt(slow)] > 0 and nums[fast] * nums[nxt(fast)] > 0:

if slow == fast:

if slow == nxt(slow):

break

else:

return True

slow = nxt(slow)

fast = nxt(nxt(fast))

# 访问过的置0

index = i

while nums[index] * nums[nxt(index)] > 0:

nums[index] = 0

index = nxt(index)

return False

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

### 回答1: 我可以为你提供一个简单的Python程序来实现循环队列:class Queue: def __init__(self, capacity): self.capacity = capacity self.queue = [None] * capacity self.head = 0 self.tail = 0 def is_empty(self): return self.head == self.tail def is_full(self): return (self.tail + 1) % self.capacity == self.head def enqueue(self, data): if self.is_full(): return False self.queue[self.tail] = data self.tail = (self.tail + 1) % self.capacity return True def dequeue(self): if self.is_empty(): return False data = self.queue[self.head] self.head = (self.head + 1) % self.capacity return data queue = Queue(5) queue.enqueue(1) queue.enqueue(2) queue.enqueue(3) print(queue.dequeue()) # 1 print(queue.dequeue()) # 2 print(queue.dequeue()) # 3 ### 回答2: 循环队列是一种基于数组实现的队列数据结构,在队列满时可以通过循环利用未使用的数组空间来实现入队操作。 以下是使用Python语言编写一个循环队列的示例代码: ```python class CircularQueue: def __init__(self, k): self.size = k self.queue = [None] * self.size self.front = -1 self.rear = -1 def enqueue(self, value): if self.is_full(): print("队列已满,无法入队") elif self.is_empty(): self.front = 0 self.rear = 0 self.queue[self.rear] = value else: self.rear = (self.rear + 1) % self.size self.queue[self.rear] = value def dequeue(self): if self.is_empty(): print("队列为空,无法出队") elif self.front == self.rear: value = self.queue[self.front] self.front = -1 self.rear = -1 return value else: value = self.queue[self.front] self.front = (self.front + 1) % self.size return value def is_empty(self): return self.front == -1 and self.rear == -1 def is_full(self): return (self.rear + 1) % self.size == self.front def display(self): if self.is_empty(): print("队列为空") else: i = self.front while i != self.rear: print(self.queue[i]) i = (i + 1) % self.size print(self.queue[self.rear]) ``` 以上代码定义了一个`CircularQueue`类,使用了一个长度为`k`的列表`queue`来实现循环队列。其中,`front`指向队列的第一个元素,`rear`指向队列的最后一个元素。`enqueue()`方法用于入队操作,`dequeue()`方法用于出队操作。通过`is_empty()`和`is_full()`方法判断队列是否为空或者已满。`display()`方法用于打印队列中的所有元素。 可以使用以下代码进行测试: ```python q = CircularQueue(5) q.enqueue(1) q.enqueue(2) q.enqueue(3) q.enqueue(4) q.enqueue(5) q.enqueue(6) # 队列已满,无法入队 q.display() # 输出:1 2 3 4 5 q.dequeue() q.dequeue() q.display() # 输出:3 4 5 ``` 这样,我们就成功地使用Python实现了一个循环队列。 ### 回答3: 循环队列也称为环形队列,是一种特殊的队列数据结构,其特点是队尾指针可以在队列的末尾和队列的开头之间循环。以下是用Python实现循环队列的代码: ```python class CircularQueue: def __init__(self, capacity): self.capacity = capacity self.queue = [None] * capacity self.front = self.rear = -1 def is_empty(self): return self.front == -1 def is_full(self): return (self.rear + 1) % self.capacity == self.front def enqueue(self, item): if self.is_full(): print("队列已满") elif self.is_empty(): self.front = self.rear = 0 self.queue[self.rear] = item else: self.rear = (self.rear + 1) % self.capacity self.queue[self.rear] = item def dequeue(self): if self.is_empty(): print("队列为空") elif self.front == self.rear: item = self.queue[self.front] self.front = self.rear = -1 return item else: item = self.queue[self.front] self.front = (self.front + 1) % self.capacity return item def display(self): if self.is_empty(): print("队列为空") elif self.rear >= self.front: for i in range(self.front, self.rear + 1): print(self.queue[i], end=" ") print() else: for i in range(self.front, self.capacity): print(self.queue[i], end=" ") for i in range(0, self.rear + 1): print(self.queue[i], end=" ") print() ``` 该循环队列的核心思想是使用一个固定大小的列表(capacity)来存储队列元素,同时维护两个指针front和rear分别指向队列的头部和尾部。 其中,is_empty()和is_full()函数用于判断队列是否为空和是否已满。enqueue(item)函数用于入队操作,如果队列已满则打印提示信息,否则将元素添加到队尾。dequeue()函数用于出队操作,如果队列为空则打印提示信息,否则返回队头元素并将front指针后移。display()函数用于打印队列元素,如果队列为空则打印提示信息,否则按顺序打印队列中的元素。 以上是用Python实现循环队列的简单示例代码,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值