1. 程式人生 > >藍橋杯 演算法訓練 ALGO-79 刪除陣列零元素

藍橋杯 演算法訓練 ALGO-79 刪除陣列零元素

演算法訓練 刪除陣列零元素
時間限制:1.0s 記憶體限制:512.0MB
從鍵盤讀入n個整數放入陣列中,編寫函式CompactIntegers,刪除陣列中所有值為0的元素,其後元素向陣列首端移動。注意,CompactIntegers函式需要接受陣列及其元素個數作為引數,函式返回值應為刪除操作執行後陣列的新元素個數。輸出刪除後陣列中元素的個數並依次輸出陣列元素。
樣例輸入: (輸入格式說明:5為輸入資料的個數,3 4 0 0 2 是以空格隔開的5個整數)
5
3 4 0 0 2
樣例輸出:(輸出格式說明:3為非零資料的個數,3 4 2 是以空格隔開的3個非零整數)
3
3 4 2
樣例輸入:
7
0 0 7 0 0 9 0
樣例輸出:
2
7 9
樣例輸入:
3
0 0 0
樣例輸出:
0

分析:本題規定了子函式的返回值,函式名,引數以及具體操作,剩下的就是我們去定義這個函式並且寫操作的具體程式碼了。
要求刪除陣列中0元素,其後元素向陣列首端移動,這個很簡單。
值得注意的是,下一次判斷的時候,陣列長度要減一,迴圈索引 i i 也要減一。
因為0元素的下一個元素前移了,如果 i

i 不減一,繼續++迴圈,會導致0元素的下一個元素沒有檢索到,如果下一位依然是0,就會導致錯誤。程式碼如下:

#include <iostream>
using namespace std;

int CompactIntegers(int *num, int n)
{
	int i, j;
	for(i = 0; i < n; i++)
	{
		if(num[i] == 0)
		{
			for(j = i + 1; j < n; j++)
			{
				num[j-1] = num[j];
			}
			n--, i--;
		}
	}
	return n;
}

int main()
{
	int n, *num, i;
	
	cin >> n;
	num = new int[n];
	
	for(i = 0; i < n; i++)
	{
		cin >> num[i];
	}
	
	n = CompactIntegers(num, n);
	
	cout << n << endl;
	for(i = 0; i < n; i++)
	{
		cout << num[i] << " ";
	}
	return 0;
}