**
leetcode-移动零
**@TOC
**移动零
移动零
**# 欢迎使用Markdown编移动零器
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]入代码片`
说明:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。
Java解析:
方法一:
考虑到是将0元素全部放到右边,非零元素按照原来的顺序放到左边,所以可以对数组进行两次遍历,第一次遍历把非零元素全部放到右遍,第二次遍历把剩下的几个元素(nums.length-j)全部置为0.
定义i和j作为指针,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。
第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。
时间复杂度:O(n)
空间复杂度:O(1)
实现代码:
import java.util.Scanner;
public class 数组0元素转移 {
public static void move_0(int [] nums){
int j=0;
if(nums.length==0){
return ;
}
//把非空元素元素右移,
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j++]=nums[i];
}
}
//把剩下的元素全部置为0;
for(int i=j;i<nums.length;i++){
nums[i]=0;
}
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
public static void main(String[] args) {
int [] nums = {1,2,0,1,0,2,3,4,5,0};
move_0(nums);
}
}
方法二:
我们可以遍历一次,使用快速排序的方法:
快速排序首先需要找到一个等待分割的元素作为桩,这里我们可以选择0元素,一般是比较大小,但是这里也可能有负数,所以把不为零的数字都以0位桩进行左右交换;我们使用两个指针i和j,只要nums[i]!=0,我们就交换nums[i]和nums[j]。
时间复杂度:O(n)
空间复杂度:O(1)
实现代码:
public class 转换0 {
public static void move_0(int [] nums){
int j=0;
//数组为空直接返回
if(nums==null){
return;
}
//当前元素!=0,就把它交换到左边,等于0的交换到右边
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
int t=nums[i];
nums[i]=nums[j];
nums[j++]=t;
}
}
//打印输出显示
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
public static void main(String[] args) {
int [] nums={1,2,3,0,6,5,0,7,0,78,0};
move_0(nums);
}
}