leecode刷题(8)– 移动零
移动零
描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
思路:
依据题目,我们将数组中值不为 0 的元素往前移,将值为 0 的元素移动到最后面。可以设置一个数组元素下标,初始化为 0,从前往后遍历数组,当遇到值为 0 的元素时让其和初始化为 0 的下标对应的元素交换,然后下标加 1 ,这样遍历下来,我们便将值不为 0 的元素移动到了前面,值为 0 的元素自然而然就放在后面了。
代码如下:
import java.util.Arrays;
public class MoveZeroes {
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return ;
}
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
int temp = nums[i];
nums[i] = nums[index];
nums[index++] = temp;
}
}
}
public static void main(String[] args) {
int[] nums = {0,1,0,3,12};
moveZeroes(nums);
System.out.println(Arrays.toString(nums));
}
}
另一种写法:
这种写法和刚刚的写法差不多,把数组中所有的非零元素,按顺序给数组的前段元素位赋值,剩下的全部直接赋值0。其实和上边相比,就多了个赋值 0 的操作,还没那么简洁,建议采取第一种(破涕而笑)。但是还是自己写出来的,记录一下,哈哈。
import java.util.Arrays;
public class MoveZeroes {
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return ;
}
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[index] = nums[i];
++index;
/*
nums[index] = nums[i];
++index;
这两句可以简写成:
nums[index++] = nums[i]; 简化一点
*/
}
}
for (int i = index; i < nums.length; i++) {
nums[i] = 0;
}
}
public static void main(String[] args) {
int[] nums = {0,1,0,3,12};
moveZeroes(nums);
System.out.println(Arrays.toString(nums));
}
}