专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
AHTV第一时间  ·  9集出现6次,网友呼吁下架!剧方火速删除.. ... ·  23 小时前  
AHTV第一时间  ·  9集出现6次,网友呼吁下架!剧方火速删除.. ... ·  23 小时前  
于小戈  ·  他俩也离??就问内娱还剩谁没离? ·  昨天  
看电视  ·  国漫的破界革命 ·  3 天前  
家有好大事  ·  父亲,你的偏心是我一辈子的痛 ·  3 天前  
家有好大事  ·  父亲,你的偏心是我一辈子的痛 ·  3 天前  
51好读  ›  专栏  ›  吴师兄学算法

字节员工去面试,我笑了。。。

吴师兄学算法  · 公众号  ·  · 2024-04-20 11:16

正文

大家好,我是吴师兄。

前段时间飞书裁员的事情让互联网的段子手们想出了不少搞笑的段子,由于有不少字节的同学流入市场,自然避免不了需要面试,而那些曾经因为面试字节算法题饱受伤害的同学,免不了以彼之道还施彼身,打算出一些 Hard 题目狠狠地出一口恶气。

不过,字节的同学毕竟是真枪实弹的刷了几百题才进字节的,这些难题都是小阵仗。


然后继续今天的算法学习,来一个简单的算法题: 移动零

一、题目描述

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示 :

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

进阶: 你能尽量减少完成的操作次数吗?

二、题目解析

在这个问题中,主要涉及到对数组的操作。数组是一种线性表数据结构,具有连续的内存空间,可以通过下标来访问其中的元素。

算法考察点

  1. 数组遍历:遍历数组是这个问题的核心操作,需要通过循环遍历数组元素。
  2. 指针操作:使用指针来记录当前处理的位置,可以减少不必要的移动操作。
  3. 元素交换:将非零元素移动到数组前部,可以采用元素交换的方式实现。

算法思路

  1. 设置两个指针 slow fast ,初始值均为 0。
  2. 遍历数组,对于每个元素:
  • 如果当前元素不为 0,则将其移动到 slow 指向的位置,并将 slow 指针后移一位。
  • 如果当前元素为 0,则不做处理,继续向后遍历。
  • 遍历完成后, slow 指针指向的位置即为所有非零元素的末尾。
  • slow 指针后面的所有元素都设置为 0,即完成了将所有 0 移动到数组末尾的操作。
  • 算法的优势

    • 算法通过两个指针来记录数组中的位置,避免了对数组进行频繁的移动操作,提高了效率。
    • 遍历一次数组即可完成移动零的操作,时间复杂度较低。

    算法的适用性

    • 适用于需要将数组中的零元素移动到末尾的情况,时间复杂度与数组长度成线性关系。

    易错点

    1. 遍历过程中需要注意索引的变化,确保 slow 指针始终指向已经处理好的位置。
    2. 在更新元素位置时,确保 slow 指针的值正确,不要覆盖了已经处理好的元素。

    类似的算法题

    • LeetCode 第 27 号问题:“移除元素”:给定一个数组 nums 和一个值 val ,需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

    三、参考代码







    请到「今天看啥」查看全文