算法:移动0到最末尾的位置-python实现

本文回顾了一道常见的面试题:如何将数组中的零元素移动到数组的末尾,同时保持非零元素的相对顺序,且空间复杂度为O(1)。文章分享了一个简单有效的方法,通过使用一个变量i来记录非零元素的当前位置,遍历数组并将非零元素放置在i位置,最后填充剩余位置为零。

移动0到最末尾的位置

今天面试的时候被问到了,很蒙蔽,瞬间想到了几种方法,但是都不是最优解。回来发现还是自己5个月前做过的题目,真是应该反思一下为什么想不出来。

问题描述:将数组中的0移动到数组的末尾,并且空间复杂度是O(1)。

我瞬间能想到的方法就是利用一个新的数组,依次遍历原数组,如果为0,则统计0的个数并且跳过这个数,如果不为0,则将该数添加到新数组中,最后在新数组后添加0。

如何原地去做呢?其实很简单,思想上就是利用原数组来充当上文的新数组。比如有数组[0,1,2,3,2,0,0,21,2]。先创建一个变量 i用于表示非0数字的下标,那么如果遇到了0,则跳过,如果遇到了非0,则将其放在下标为 i 的位置即可。最后 i 的值就是非0的个数,添加 数组长度-i个0就可以了。

def removeZero(nums):
	i = 0
	for num in nums:
		if num != 0:
			nums[i] = num
			i+=1
	for k in range(i,len(nums):
		nums[i] = 0 

所以说这道题如果直到答案,算是很简单的。为什么我在面试的时候想不到呢?我的固定思维让我第一时间想到的是交换两个数,如果想的是交换两个数字来达到目的,那么路就走偏了。这种题目在思路上应该想到的是将除0以外的数看做一个整体,用一个 i 变量来维护它本来的顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值