给一个数组 nums 写一个函数将 0
移动到数组的最后面,非零元素保持原数组的顺序
注意事项
1.必须在原数组上操作
2.最小化操作数
样例
给出 nums = [0, 1, 0, 3, 12]
, 调用函数之后, nums = [1, 3, 12, 0, 0]
.
错误:
public class Solution {
/*
* @param nums: an integer array
* @return:
*/
}
public static void moveZeroes(int[] nums) {
// write your code here
//0的计数器
int count = 0;
//遍历数组
for(int i = 0;i <= nums.length-1;i++){
//记录0的索引
if(nums[i] == 0){
//将数组逆序,把0放在最后
for(int start = i,end = nums.length-1-count;start <= end;start++,end--){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
}
count++;
//0前面的逆序
for(int start = i,end = nums.length-1-count;start <= end;start++,end--){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
}
}
}
/*
for(int i = 0;i <= nums.length-1;i++){
if(i == 0){
System.out.print("[ "+nums[i]+",");
}else if(i != nums.length-1){
System.out.print(nums[i]+", ");
}else{
System.out.print(nums[i]+" ]");
}
}
*/
}
}
错误原因:
不能保证两个连零出现
正确:
public class Solution {
/**
* @param nums an integer array
* @return nothing, do this in-place
*/
public void moveZeroes(int[] nums) {
// Write your code here
//判断是否是空数组
if(nums.length==0||nums==null){
return;
}
//定义计数器,统计0的个数
int countZeros=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
countZeros++;
}
}
//删除0
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++;
}else{
}
}
//将最后几位补为0
for(int i=nums.length-countZeros;i<nums.length;i++){
nums[i]=0;
}
}
}