题目:Move Zeroes
LeetCode:(https://leetcode.com/problems/move-zeroes/description/)
**Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.
本题的要求是将给定的数组中的0值移动到数组末尾,并且要求不能增加额外的数组进行复制操作。
采用循环遍历,ReplceIndex用于指定被取代的索引位置,若检测到非0数值,就进行取代操作。
遍历完数组之后,再将ReplceIndex到numsSize之间的位置置0。
程序不断优化,共三个函数,leetcode测试案例总时间一直降低,16-9-6ms。
时间复杂度都为O(n);
#include<stdio.h>
void moveZeroes(int *nums , int numsSize);//16ms
void moveZeroes1(int *nums , int numsSize);//9ms
void moveZeroes2(int *nums , int numsSize);//6ms
int TestArr0[] = {0,1,2,3,4,5};
int TestArr1[] = {1,1,2,3,4,5};
int TestArr2[] = {0,1,0,3,0,5};
int TestArr3[] = {0,0,2,3,4,5};
int TestArr4[] = {2,3,6,4,0,0};
int main(int argc ,char *argv[])
{
int len = 0;
printf("\r\n********systerm start **************\r\n");
//test 0
len = 6;
printf("\r\ntest0 :\r\n ");
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr0[i]);
}
printf("\r\n");
moveZeroes1(TestArr0,len);
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr0[i]);
}
//test 1
len = 6;
printf("\r\ntest1 :\r\n ");
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr1[i]);
}
printf("\r\n");
moveZeroes1(TestArr1,len);
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr1[i]);
}
//test 2
len = 6;
printf("\r\ntest2 :\r\n ");
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr2[i]);
}
printf("\r\n");
moveZeroes1(TestArr2,len);
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr2[i]);
}
//test 3
len = 6;
printf("\r\ntest3 :\r\n ");
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr3[i]);
}
printf("\r\n");
moveZeroes1(TestArr3,len);
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr3[i]);
}
//test 4
len = 6;
printf("\r\ntest4 :\r\n ");
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr4[i]);
}
printf("\r\n");
moveZeroes1(TestArr4,len);
for(int i = 0 ;i < len ;i++)
{
printf("%d\t",TestArr4[i]);
}
printf("\r\n********systerm finish **************\r\n");
return 1;
}
void moveZeroes(int *nums , int numsSize)
{
int index = 0;
int ReplceIndex = 0;
int IncFlag = 1;
if(nums == NULL )
{
return;
}
for(index = 0; index < numsSize - 1; index++)
{
if(IncFlag)
{
if(*(nums + index) == 0)
{
IncFlag = 0;
}
else
{
ReplceIndex++;
}
}
if((*(nums + index) == 0)
&& *(nums + index +1))
{
*(nums + ReplceIndex) = *(nums + index +1);
*(nums + index +1) = 0;
ReplceIndex++;
}
}
}
void moveZeroes1(int *nums , int numsSize)
{
int index = 0;
int ReplceIndex = 0;
int IncFlag = 1;
if(nums == NULL )
{
return;
}
for(index = 0; index < numsSize; index++)
{
if(*(nums + index))
{
*(nums + ReplceIndex) = *(nums + index);
ReplceIndex++;
}
}
for(index = ReplceIndex ;index < numsSize; index++)
{
*(nums + index) = 0;
}
}
void moveZeroes3(int* nums, int numsSize)
{
int index;
int ReplceIndex = 0;
if(nums == NULL )
{
return;
}
for(index = 0; index < numsSize; index++)
{
if(nums[index])
{
nums[ReplceIndex++] = nums[index];
}
}
for(index = ReplceIndex ;index < numsSize; index++)
{
nums[index] = 0;
}
}