题目的主要信息:
- 写一个函数:void func(int *p, int n)
- 将数组arr中为 0 的元素都移至数组末尾,将非 0 的元素移至开始
- 保持原来的顺序不变
具体做法:
数组输入函数中是以指针的形式,因此我们可以用该指针加上下标,用*访问或者修改该位置的内容。
我们函数两次循环:第一次循环的时候,将数组中的第一个0找出,并且记录其下标(此时0元素开始的下标和结束的下标相等);第二次循环的时候,直接从0元素开始的下标后一位开始遍历,如果遍历过程中,遇到了0,则将0的结束下标更新为当前指针;如果没有遇到0,则将0元素开始位置和当前位置的数进行置换,并且将0元素的开始下标和结束下标都+1。这样能够保证0与0之间连续同步移动。
#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(1),无额外空间