热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图解数组操作:美团面试题之移动零(双方法解析)

本文详细解析了一道来自美团的面试题——移动零。此问题要求在不改变非零元素相对顺序的前提下,将数组中的所有零移至末尾。文章提供了两种高效的解决方案,并附带代码示例。

在编程面试中,数组操作是常见的考察点之一。本文将探讨如何解决一道来自美团的面试题——移动零。题目要求将数组中的所有零元素移动到数组的末尾,同时保持非零元素原有的相对顺序不变。我们将通过两次遍历和一次遍历两种方法来解决这个问题。


题目描述

给定一个整型数组 nums,请编写一个函数将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序不变。

例如,给定数组 [0,1,0,3,12],处理后的结果应为 [1,3,12,0,0]

需要注意的是,此操作必须直接在给定的数组上进行,不允许使用额外的数组空间,并且尽量减少操作次数。

题目链接:LeetCode - Move Zeroes

方法一:两次遍历

该方法使用两个指针 ij。第一次遍历时,j 记录非零元素的数量。每当遇到非零元素时,就将其移到数组的前面部分。完成第一次遍历后,j 的值即为最后一个非零元素的位置。接着,从 j 开始的剩余位置全部设为零。

这种方法的时间复杂度为 O(n),空间复杂度为 O(1)。

Java 实现:

public class Solution {    public void moveZeroes(int[] nums) {        if (nums == null) return;        int j = 0; // 记录非零元素的位置        for (int i = 0; i 

Python 实现:

class Solution:    def moveZeroes(self, nums):        if not nums: return        j = 0 # 记录非零元素的位置        for i in range(len(nums)):            if nums[i]:                nums[j] = nums[i]                j += 1        # 剩余位置填充零        for i in range(j, len(nums)):            nums[i] = 0

方法二:一次遍历

此方法借鉴了快速排序的思想。选择 0 作为分界点,将所有非零元素置于 0 的左侧,0 则置于右侧。利用两个指针 ij,当 nums[i] 不等于 0 时,与 nums[j] 交换位置,然后递增 j

这种方式同样具有 O(n) 的时间复杂度和 O(1) 的空间复杂度。

Java 实现:

public class Solution {    public void moveZeroes(int[] nums) {        if (nums == null) return;        int j = 0; // 记录非零元素的位置        for (int i = 0; i 

Python 实现:

class Solution:    def moveZeroes(self, nums):        if not nums: return        j = 0 # 记录非零元素的位置        for i in range(len(nums)):            if nums[i]:                nums[j], nums[i] = nums[i], nums[j]                j += 1

以上两种方法都能有效地解决问题,具体选择哪种取决于实际应用场景和个人偏好。希望本文对你有所帮助!


推荐阅读
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • 本文详细解析了muduo库中的Socket封装及字节序转换功能。主要涉及`Endian.h`和`SocketsOps.h`两个头文件,以及`Socket.h`和`InetAddress.h`类的实现。 ... [详细]
  • 目录介绍01.CoordinatorLayout滑动抖动问题描述02.滑动抖动问题分析03.自定义AppBarLayout.Behavior说明04.CoordinatorLayo ... [详细]
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • HTML5实现逼真树叶飘落动画详解
    本文详细介绍了如何利用HTML5技术创建一个逼真的树叶飘落动画,包括HTML、CSS和JavaScript的代码实现及优化技巧。 ... [详细]
  • 本文深入探讨了 AdapterView 中 onItemClick 方法的工作原理及其参数的具体含义,结合实际案例分析其应用场景。 ... [详细]
  • 利用Java与Tesseract-OCR实现数字识别
    本文深入探讨了如何利用Java语言结合Tesseract-OCR技术来实现图像中的数字识别功能,旨在为开发者提供详细的指导和实践案例。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 本文详细探讨了ECMAScript中的面向对象编程概念,包括对象、类与实例的基本定义,以及面向对象语言的关键特性。 ... [详细]
  • 在Elasticsearch中,映射(mappings)定义了索引中字段的结构,类似于传统数据库中的表结构。虽然Elasticsearch支持字段的增删,但直接修改字段类型是不允许的。本文介绍了一种通过创建新索引并迁移数据的方式来改变字段类型的方法。 ... [详细]
  • 本文档详细介绍了2017年8月31日关于MySQL数据库备份与恢复的教学内容,包括MySQL日志功能、备份策略、备份工具及实战演练。 ... [详细]
  • Zookeeper面试常见问题解析
    本文详细介绍了Zookeeper中的ZAB协议、节点类型、ACL权限控制机制、角色分工、工作状态、Watch机制、常用客户端、分布式锁实现、默认通信框架以及消息广播和领导选举的流程。 ... [详细]
  • C# 对象转 JSON 字符串的方法与应用
    本文介绍如何在 C# 中使用一般处理程序(ASHX)将对象转换为 JSON 字符串,并通过设置响应类型为 application/json 来确保客户端能够正确解析返回的数据。同时,文章还提供了 HTML 页面中不依赖 jQuery 的 AJAX 方法来接收和处理这些 JSON 数据的具体实现。 ... [详细]
  • NIO 通道接口详解
    本文介绍了NIO(New Input/Output)中的通道接口及其相关概念,包括通道的基本功能、接口设计以及各类通道接口的具体用途。通过本文,读者可以深入了解NIO通道的设计原理及其在实际项目中的应用。 ... [详细]
  • 对 manual_async_fn 进行了改进,确保其能够正确处理和捕获输入的生命周期。 ... [详细]
author-avatar
手机用户2502912857
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有