给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
法一: 直接法
有两种写法。一种是申请一块新的内从空间。一种是直接在原有的数组中进行修改。
写法一:
void moveZeroes(int* nums, int numsSize){
int j=0;
int i=0;
for(i=0;i<numsSize;i++)
{
if(nums[i]!=0)
{
nums[j++]=nums[i];
}
}
while(j<numsSize)
{
nums[j++]=0;
}
}
写法二:
void moveZeroes(int* nums, int numsSize){
int i=0;
int j=0;
int arr[numsSize];
for(i=0;i<numsSize;i++)
{
if(nums[i]!=0)
{
arr[j]=nums[i];
j++;
}
}
for(j=j;j<numsSize;j++)
{
arr[j]=0;
}
for(i=0;i<numsSize;i++)
{
nums[i]=arr[i];
}
}
法二:
将本数组遍历一遍,并且判断第i个位置与第i+1个位置的值是否位第i个位置的值为0,第i+1个的位置的值大于0;如果是那就两两交换。
写法一:
void moveZeroes(int* nums, int numsSize){
int i=0;
int j=0;
for(j=0;j<numsSize;j++)
{
for(i=0;i+1<numsSize;i++)
{
if(nums[i]==0&&nums[i+1]!=0)
{
int t=nums[i];
nums[i]=nums[i+1];
nums[i+1]=t;
}
}
}
}
写法二:
void moveZeroes(int* nums, int numsSize){
bool isok=true;
while(true)
{
for(int i=0;i<numsSize;i++)
{
if(nums[i]==0&&nums[i+1]!=0)
{
isok=false;
nums[i]=nums[i+1];
nums[i]=0;
}
}
if(isok)
{
break;
}
}
}