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