标签:
题目描述:给定一个数组,假定这个数组中多个0,并且其他元素都各出现一次,
试将所有的0移到数组的尾部。
举例:
给定数组: 1,3,0,5,7,0,3,4
最后所得数组:1,3,5,7,3,4,0,0
下边给出两种方法实现:
方法一:原理就是遇到0的时候,后边的元素统一向前移动。如果前边是1个0,后边元素
向前移动一个,如果两个0,后边元素向前移动2个,以此类推,最后将后边的元素填充为
0即可。
代码实现:
#include<stdio.h>
void moveZeros(int arr[], int len)
{
if (len <= 0)
{
return;
}
int i = 0;
int zeros = 0;
for (i = 0;i < len; i++)
{
if (arr[i] != 0)
{
arr[i - zeros] = arr[i];
}
else
{
zeros++;
}
}
for (i = len - zeros;i < len;i++)
{
arr[i] = 0;
}
}
int main()
{
int arr[8] = { 1,3,0,7,8,0,2,9 };
moveZeros(arr,8);
int i = 0;
for (i = 0;i < 8; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}方法二:
代码实现:
#include<stdio.h>
void moveZeros2(int arr[], int len)
{
if (len <= 0)
{
return;
}
int i = 0;
int tmp = 0;
int j = 0;
for (i = 0;i < len; i++)
{
if (arr[i] != 0)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
j++;
}
}
}
int main()
{
int arr[8] = { 1,3,0,7,8,0,2,9 };
moveZeros2(arr,8);
int i = 0;
for (i = 0;i < 8; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}当然了,解决这道题目还有别的办法,比如,数组后边的非0元素和数组前边的0交换。
不过感觉就上边的方法2效率高。
好了,先整理到这里。
标签:
原文地址:http://blog.csdn.net/peiyao456/article/details/51906111