數組非0數順序不變,將0挪到最後 (Python,C++)

如題:這裏使用的簡單思路就是以此從前往後遍歷,每一次遇到第一個爲 0 的數的位置爲 i ,就新建一個指針爲 j = i+1 緊臨着當前位置, 然後再滑動 j 指針,尋找非零的數,期間需要對剩餘部分全部是 0 或者數組全部爲 非 0 數做一個邊界條件的判斷:

Python 實現:

list=[1, 0, 23, 4, 0, 4, 0, 5, 6, 0, 4, 3, 0, 0]
i=0
while(i<len(list)):
    while(i<len(list) and list[i]!=0):  # 尋找第一個 0 的位置
        i+=1
    j=i+1
    while(j < len(list) and list[j]==0): # 尋找第一個非 0 的位置
        j+=1

    if(i<len(list) and j<len(list)): # 可能出現數組全是非零,這樣 i 爲最後一個位置,j 已經超出範圍,所以要判斷再交換
        temp=list[i]
        list[i]=list[j]
        list[j]=temp
    i+=1

print(list)

C++ 實現

#include<iostream>
#include<vector>
using namespace std;

void move_num(vector<int> &list)
{
	int i = 0;
	int len = list.size();
	while (i < len - 1) 
	{
		while (i<len-1 && list[i] != 0) // 尋找第一個 0 的位置
			i++;
		int j = i + 1;
		while (j < len - 1 && list[j] == 0)  // 尋找第一個非 0 的位置
			j++;
		if(i<len && j<len)  // 可能出現數組全是非零,這樣 i 爲最後一個位置,j 已經超出範圍,所以要判斷再交換
			swap(list[i], list[j]);
		i++;
	}
}

int main()
{
	vector<int> list = { 1,0,23,4, 0, 4, 0,5, 6, 0, 4, 3, 0, 0 };
	//vector<int> list = { 1,2,3 };
	move_num(list);
	for(auto i: list)
		cout << i <<" ";
	cout << endl;
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章