刷题网站:Leetcode
难度: 简单
语言: Python
计划:从简单——>到中等——>再到难。
一、283移动零
1.1 题目:给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
- 示例
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
- 说明
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
1.2 思考分析
初看题目还是挺简单的,唯一的要求是在原数组上操作,不能额外的数组。
所以,我看题目的初步想法是先对数组中所有的数一个一个和零进行比较,然后把不等于0的数放在前面,然后等于零的数看下有几个,相应的放在最后。
此时,我们需要有一个遍历,且需要比较数组与零是否相等,并把相应的非零数逐个放入前面。如下
k = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[k] = nums[i]
k+=1
但是还需要将所有的零放入后面,但是放几个零呢?这需要我们在for
循环内判断有个几个零,即if
之外的值,即上式改为
k=0
n=0
for i in range(len(nums)):
if nums[i] != 0:
nums[k] = nums[i]
k+=1
else:
n+=1
此时n
的值就是我们需要添加零的个数,然后将其从右到左的顺序逐个添加即可,所以完整代码如下:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k=0
n=0
j =1
for i in range(len(nums)):
if nums[i] != 0:
nums[k] = nums[i]
k+=1
else:
n+=1
while n >0:
nums[len(nums)-n] = 0
n-=1
最终的执行结果,击败了61.87%的用户,看来只能算及格了。
后来看了题解,解析为如下代码。虽然代码很短,但是执行结果还没我的好,可能我是直接在后面补零,而它的还需交换。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
left = right = 0
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
1.3 总结
本题是简单的判断、循环和补齐问题,比较好理解,没什么难度。