题目的主要信息:

  • 写一个函数:void func(int *p, int n)
  • 将数组arr中为 0 的元素都移至数组末尾,将非 0 的元素移至开始
  • 保持原来的顺序不变

具体做法:

数组输入函数中是以指针的形式,因此我们可以用该指针加上下标,用*访问或者修改该位置的内容。

我们函数两次循环:第一次循环的时候,将数组中的第一个0找出,并且记录其下标(此时0元素开始的下标和结束的下标相等);第二次循环的时候,直接从0元素开始的下标后一位开始遍历,如果遍历过程中,遇到了0,则将0的结束下标更新为当前指针;如果没有遇到0,则将0元素开始位置和当前位置的数进行置换,并且将0元素的开始下标和结束下标都+1。这样能够保证0与0之间连续同步移动。

alt

#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

	int arr[6] = { 0 };
	for (int i = 0; i < 6; i++) {
		cin >> arr[i];
	}

	func(arr, 6);

	for (int i = 0; i < 6; i++) {
		if (i == 5) {
			cout << arr[i] << endl;
		}
		else {
			cout << arr[i] << " ";
		}
	}

	return 0;
}

void func(int* p, int n) {
	// write your code here......
    int start = 0, end = 0; 
    int i = 0;
    while(i < n){ //找到第一次出现0的位置
        if(*(p + i) == 0){
            start = i;
            end = i;
            break;
        }
        i++;
    }
    if(*(p + end) != 0) //没有出现0
        return;
    i++;
    while(i < n){
        if(*(p + i) == 0) //后面出现0,尾指针移到0
            end = i;
        else{
            *(p + start) = *(p + i); //非0替换前面的0
            *(p + i) = 0;
            start++;
            end++;
        }
        i++;
    }

}

复杂度分析:

  • 时间复杂度:O(n)O(n)O(n),遍历数组每个元素
  • 空间复杂度:O(1)O(1)O(1),无额外空间