问题描述:
从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数并依次输出数组元素。
输入格式:
第一行输入一个整数,代表数组中有多少个数,第二行输入数组的元素。
输出格式:
第一行输出不为0的元素个数,第二行输出不为0的元素。
测试样例1:
输入:
5
3 4 0 0 2
输出:
3
3 4 2(3 4 2是以空格隔开的3个数)
测试样例2:
输入:
3
0 0 0
输出:
0
测试样例3:
输入:
7
0 0 7 0 0 9 0
输出:
2
7 9
思路:直接对整个数组进行遍历,遇到0就把0后面的元素往前移,然后减少数组的元素个数。
代码如下:
1 #include<iostream> 2 using namespace std; 3 int CompactIntegers(int *arr,int n) 4 { 5 //直接从头到尾遍历整个数组,是0就将n减1,同时数组下表往前移 6 for (int i = 0; i < n; i++) 7 { 8 if (arr[i] == 0) 9 { 10 //将所有元素向前移 11 int j = i; 12 for (; j < n - 1; j++) 13 { 14 arr[j] = arr[j + 1]; 15 } 16 //将要判断的元素的下标前移 17 i = i - 1; 18 //非0元素个数减1 19 n--; 20 } 21 } 22 return n; 23 } 24 25 int main(void) 26 { 27 int n; 28 cin >> n; 29 int* arr = new int[n]; 30 for (int i = 0; i < n; i++) 31 { 32 cin >> arr[i]; 33 } 34 int t = CompactIntegers(arr, n); 35 cout << t << endl; 36 if (t == 0) 37 { 38 return 0; 39 } 40 else 41 { 42 for (int i = 0; i < t - 1; i++) 43 { 44 cout << arr[i] << " "; 45 } 46 cout << arr[t - 1]; 47 } 48 return 0; 49 }