当前位置: 首页 > news >正文

Leetcode 283 移动零

引言

今天,看到了一个双指针算法,构思非常巧妙。这里特来记录一下。

正文

在这里插入图片描述
本题,我们使用两个指针,一左一右,右侧指针不断向右侧移动,如果右侧指针所指向的数据值不为 0,那么我们就交换右侧指针和左侧指针的数据,且左侧指针向右侧位移一个位置。这样就可以将所有不为 0 的元素按照顺序放置到左指针的左侧。遇到右侧指针指向元素为 0 的情况,我们不做任何操作,继续将右侧指针向右侧位移一个元素。直至右侧指针抵达最后一个元素位置处结束。通过这种方法,就可以将为 0 的元素统一位移到左侧指针的右侧。最终左侧指针位置的左侧全部不为 0, 右侧全部为 0

from typing import Listdef move_list_element(nums: List[int]):left = 0for i in range(len(nums)):if nums[i] != 0:nums[left], nums[i] = nums[i], nums[left]left += 1return numsif __name__ == '__main__':nums_ = [0, 1, 0, 3, 12]result = move_list_element(nums_)print(result)
"""
[1, 3, 12, 0, 0]
"""

上述代码中的 left 表示左指针,i 表示右指针。
对于双指针,最清晰的写法是使用 while 循环。如下:

from typing import Listdef move_list_element(nums: List[int]):left = 0right = 0n = len(nums)while right < n:if nums[right] != 0:nums[left], nums[right] = nums[right], nums[left]left += 1right += 1return numsif __name__ == '__main__':nums_ = [0, 1, 0, 3, 12]result = move_list_element(nums_)print(result)
"""
[1, 3, 12, 0, 0]
"""

如果大家觉得有用,就请点个赞吧~


http://www.mrgr.cn/news/2230.html

相关文章:

  • TCP并发服务器
  • 海康相机LinuxSDK CMakeLists.txt
  • flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案
  • 【嵌入式开发之网络编程】网络分层、OSI七层模型、TCP/IP及五层体系结构
  • PE文件格式
  • HarmonyOS开发:长列表界面实现详解(使用懒加载)
  • python3爬虫(未完结)
  • 「OC」探索CALayer:基础知识与实用技巧简要介绍
  • 【知识分享】ubuntu22.04-ESP32环境搭建
  • AI系列-黑神话:悟空
  • 如何将excel以文本形式储存的数字一键转换为数字
  • 8.20刷题笔记
  • SQL学习五大步骤
  • 可复制拖拽流程图
  • AI 进阶实战 | 走进大模型(LLM)+智能体(Agent)+提示词(Prompt)
  • 深度学习基础—Batch Norm
  • PMP考试不用慌,收下这份备考指南(附PMP学习资料包)
  • Tomcat部署项目get请求中文乱码
  • 为什么apple email的邮件显示不全
  • avx2 计算一个uint8_t数组的平方加速