码迷,mamicode.com
首页 > 移动开发 > 详细

小算法--数组中元素的移动

时间:2016-07-14 10:29:45      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:给定一个数组,假定这个数组中多个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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!