Java实现Move Zeroes ,题目如下:
时间复杂度(N^2):解题思想首先遍历数组,若数组中存在0,记录0的个数的变量count自加一,且0以后的数据依次上移一位,数组长度减1;遍历数组后,根据记录的0的个数,依次从数组末尾赋值0;
public class Solution {public void moveZeroes(int[] nums) {
int count=0;
int length=nums.length;
for(int i=0;i<length;i++)
{
if(nums[i]==0)
{
for(int j=i;j<length-1;j++)
{
nums[j]=nums[j+1]; //遍历0后,将其以后的数进行搬移
}
count++; //取得零的个数
length--; //0以后的数据上移一位,数组长度减1
i=i-1; //数组向上移位后i应重新查看是否为0
}
}
for(int i=1;i<count+1;i++)//根据0的个数对数组最后几位置零
{
nums[nums.length-i]=0;
}
}
}
注意:注释部分,取得数组中的0的个数,数组元素为0则count++(count++; ),数组0以后的数据上移一位后,数组长度length应减一( length--; ),且数组遍历需从原处开始( i=i-1; );
时间复杂度(N):此算法比算法一时间复杂度有所提高,首先遍历数组,保存非零的数据至数组遍历位置的前方,遍历整个数组后,对数组余下为赋值的位置赋0;
public class Solution {
public void moveZeroes(int[] nums) {
int newlen=0;
int length=nums.length;
for(int i=0;i<length;i++)
{
if(nums[i]!=0)
{
nums[newlen++]=nums[i]; //遍历非0的数即保存
}
}
for(;newlen<length;newlen++)//对于数组未填满的数赋0
{
nums[newlen]=0;
}
}
}
注意:此算法关键在于 nums[newlen++]=nums[i]; ,利用数组本身自复制;