leetcode移动零Python哈希
时间: 2024-09-19 17:00:28 浏览: 76
在 LeetCode 中,"移动零"这个问题通常涉及到数组操作和逻辑思维。给定一个由整数组成的数组,你需要将所有零元素向右移动,使得非零元素保持相对顺序不变。这个过程可以在 Python 中通过巧妙地使用双指针技术来实现,同时利用哈希表或者列表推导式跟踪非零元素的位置。
以下是一个简单的 Python 解决方案示例:
```python
def moveZeroes(nums):
non_zero_count = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[non_zero_count], nums[i] = nums[i], nums[non_zero_count]
non_zero_count += 1
while non_zero_count < len(nums):
nums[non_zero_count] = 0
non_zero_count += 1
# 测试样例
nums = [0, 1, 0, 3, 12]
moveZeroes(nums)
print(nums) # 输出: [1, 3, 12, 0, 0]
```
在这个代码中,`non_zero_count` 变量记录了非零元素的数量。遍历过程中,遇到非零数就直接交换到正确位置,并更新计数器。最后,把剩余的所有零元素填入剩下的位置。
相关问题
leetcode 141python
### LeetCode 141 题目解析
LeetCode第141题名为“环形链表”,目标是在给定的单向链表中检测是否存在环。此问题可以通过多种方式解决,其中一种高效的方法是采用快慢指针(也称为Floyd判圈算法)。这种方法基于两个不同速度移动的指针最终会在环内相遇的原则。
对于该问题的一种解决方案如下所示:
```python
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
if not head or not head.next:
return False
slow = head
fast = head
while fast and fast.next:
slow = slow.next # 移动一步
fast = fast.next.next # 移动两步
if slow == fast:
return True # 如果两者相遇,则存在环
return False # 若遍历结束未相遇则无环
```
上述代码定义了一个`hasCycle`函数用于判断链表是否有环[^2]。通过初始化两个指针`fast`和`slow`均指向链表头部开始,在每次迭代过程中让`fast`前进两次而`slow`仅前进一步。当这两个指针在某次更新后位置相同的时候就说明链表中有环;反之,如果`fast`或者它的下一个节点为空,则表示已经到达链表末端,因此可以断言链表不含任何环结构[^3]。
#### 关键点解释
- **边界情况处理**:首先检查输入是否为空或只有一个元素的情况,这两种情况下都不可能形成环。
- **双指针策略**:使用一对快慢指针来探索整个列表,直到找到重复访问过的结点或是抵达结尾为止。
- **时间复杂度分析**:由于每个节点最多被访问一次,所以整体的时间复杂度为O(N),这里N代表链表中的节点数量。
- **空间复杂度优化**:相比其他方法如哈希表存储已访问节点的方式,本方案只需要常数级别的额外内存开销即可完成任务。
leetcode热题100 python
### LeetCode 热题 100 的 Python 实现
#### 数组旋转问题
对于数组旋转问题,可以通过切片操作来简化处理过程。具体来说,在给定一个整数 `k` 后,首先计算 `k % len(nums)` 来获取实际需要移动的位置数量。接着通过切片创建一个新的列表,该列表由原列表最后 `k` 个元素加上剩余部分组成。最后将新构建的结果赋值回原始列表。
```python
class Solution:
def rotate(self, nums: list[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k %= n
nums[:] = nums[-k:] + nums[:-k]
```
此方法利用了 Python 列表的强大功能,使得代码更加简洁高效[^1]。
#### 寻找两个数之和等于目标值的问题
当面对寻找两个不同位置上的数字使其相加得到特定的目标数值的任务时,一种直观的方法是对每一个可能的组合进行尝试匹配。然而这种双重循环的方式效率较低,时间复杂度达到了 O(n²),其中 n 是输入序列长度。为了提高性能,可以考虑采用哈希表存储已经访问过的元素及其索引,从而可以在常量时间内完成查询并减少不必要的重复工作。
```python
from typing import List
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_to_index = {}
for index, value in enumerate(nums):
complement = target - value
if complement in num_to_index:
return [num_to_index[complement], index]
num_to_index[value] = index
```
上述优化后的算法仅需一次遍历即可解决问题,并且平均情况下能够在线性时间内给出答案[^2]。
#### 查找最长不含重复字符子串
针对这个问题,滑动窗口技术被广泛应用。初始化左右指针指向字符串起始处,同时维护一个集合用于跟踪当前窗口内的唯一字符。随着右边界不断扩展直至遇到重复项,则收缩左边界直到再次满足条件为止;期间记录最大不重叠区间大小作为最终返回结果。
```python
def lengthOfLongestSubstring(s: str) -> int:
charSet = set()
l = 0
res = 0
for r in range(len(s)):
while s[r] in charSet:
charSet.remove(s[l])
l += 1
charSet.add(s[r])
res = max(res, r - l + 1)
return res
```
这段代码展示了如何有效地运用双端队列的思想去解决此类挑战性的题目[^4]。
阅读全文
相关推荐

















