238 移动零
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
两次遍历
创立两个指针(一个指针遍历,一个指针改数)(两个指针各遍历一遍):
- 第一个指针遍历一遍,把碰到的非零的数,都交给第二个指针修改
- 当第一个指针遍历完后,第二个指针未遍历完的部分应该都为0
时间复杂度: O(n)
空间复杂度: O(1)
//java
class solution{
public void movezeros(int[]nums){
if (nums == null){
return;
}
//i遍历,碰到非零就交给j赋值
int j=0;
for(int i=0,i<nums.length;++i){
if (nums[i]!=0){
nums[j++]=nums[i];
}
}
//非零的统计完了,j未遍历完的就全部都为0
for(int i=j,i<nums.length,++i){
nums[i]=0;
}
}
}
#python
class Solution(object):
def moveZeroes(self, nums):
if not nums:
return 0
j = 0
# xrange 是一个生成器(0.1.2.3....)
# i遍历,碰到非零就交给j赋值
for i in xrange(len(nums)):
if nums[i]:
nums[j]=nums[i]
j+=1
# 非零的统计完了,j未遍历完的就全部都为0
for i in xrange(j, len(nums)):
nums[i] =0
遍历一次
类似于快排,创立两个指针同时遍历,当一个指针碰到非零,另一个指针碰到零时,进行交换
时间复杂度: O(n)
空间复杂度: O(1)
//java
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//两个指针i和j
int j = 0;
for(int i=0;i<nums.length;i++) {
//当前元素!=0,就把其交换到左边,等于0的交换到右边
if(nums[i]!=0) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j++] = tmp;
}
}
}
}
# python
class Solution(object):
def moveZeroes(self, nums):
if not nums:
return 0
# 两个指针i和j
j = 0
for i in xrange(len(nums)):
# 当前元素!=0,就把其交换到左边,等于0的交换到右边
if nums[i]:
nums[j],nums[i] = nums[i],nums[j]
j += 1
其他解法
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
for i in range(nums.count(0)):
nums.remove(0)
nums.append(0)