给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
1、思路:查找非0元素,放在索引为0的位置上,依次安放元素。
class Solution {
public static void main(String[] args) {
// write your code here
int[] nums=new int[]{0,1,0,3,12};
Solution m=new Solution();
m.moveZeroes(nums);
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
public void moveZeroes(int[] nums) {
int count=-1;
for (int i=0;i<nums.length;i++){
if (nums[i]!=0){
count++;
nums[count]=nums[i];
}
}
for (int i=count+1;i<nums.length;i++){
nums[i]=0;
}
}
}
2、思路:查找非0元素nums[i],跟nums[count]交换,然后count+1,再对索引值为i+1的元素进行判断是否为0,但是这样有个缺点,就是数组中所有元素都为非0元素的话,元素自身要交换值,可以在进行优化,如3,所示。
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
int[] nums=new int[]{0,1,0,3,12};
Main m=new Main();
m.moveZeroes(nums);
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
public void moveZeroes(int[] nums) {
int count=0,t;
for (int i=0;i<nums.length;i++){
if (nums[i]!=0){
t=nums[count];
nums[count]=nums[i];
nums[i]=t;
count++;
}
}
}
}
3
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
int[] nums=new int[]{0,1,0,3,12};
Main m=new Main();
m.moveZeroes(nums);
for (int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
}
public void moveZeroes(int[] nums) {
int count=0,t;
for (int i=0;i<nums.length;i++){
if (nums[i]!=0){
if (i!=count){
t=nums[count];
nums[count]=nums[i];
nums[i]=t;
count++;
}
else
count++;
}
}
}
}