【每天一道算法题10】移动0元素到末尾

题目描述

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

示例:

输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

要求:

只能在原有数组上进行操作,不能新建额外的数组。

分析

这一题的难点有两个:

1.结果要保持非0元素的相对顺序

2.不能新建额外的数组

解法一:快慢指针

def solution(nums):
    n = len(nums)
    # 定义慢指针初始索引
    slow_index = 0
    for i in range(n):
        # 如果是非0元素,那就把它覆盖到慢指针的位置,同时慢指针+1
        if nums[i] != 0:
            nums[slow_index] = nums[i]
            slow_index += 1
    # 对于慢指针之后的元素,都替换为0
    for j in range(slow_index+1, n):
        nums[j] = 0

解法二:快慢指针(优化版)

思考解法一,其实我们还有更快的方法。
遍历一遍数组,遇到非0元素就把它和慢指针处的值进行交换
快指针:用于找出非0元素
慢指针:用于记录非0元素应该存放的位置
在纸上画一画不难得出,快慢指针只有如下两种情况:

  1. 刚开始快慢指针是相等的,指向同一位置,此时 该位置如果是非0元素,那就自己和自己交换,若该位置是 0元素,那慢指针就保持不动,快指针继续遍历,找到非0元素之后,再把它和慢指针处的元素进行交换。
  2. 快慢指针不想等时,慢指针指向的必然是0元素。(因为非0元素都已经被快指针找出来替换到前面去了,可以自己画一画)

直接上代码:

def solution(nums):
    # 定义慢指针初始索引
    slow_index = 0
    for fast_index in range(len(nums)):
        # 如果是非0元素
        if nums[fast_index] != 0:
            # 交换快慢指针位置的元素
            nums[slow_index], nums[fast_index] = nums[fast_index], nums[slow_index]
            # 慢指针向前移一位
            slow_index += 1

更多精彩 http://www.17hf.online/blog/article/1/7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值