详见:
https://www.nowcoder.com/practice/bb840c11be674d01b582847a6921d384?tpId=225&tags=&title=&difficulty=0&judgeStatus=0&rp=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) { // int* p = arr
// id指向第一个0所在位置,初始化是0;
int id = 0;
//i指向游标所在位置,遍历数组所有元素
for (int i=0; i<n; i++) {
if (p[i] != 0){
int temp = p[i];
p[i] = p[id];
p[id++] = temp; // p[id++] = temp;等同于先p[id]=temp,再id+=1;或id++;
}
}
}
法2
#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) { // int* p = arr
int* q = p;
int notZeroCnt = 0; // 统计非0元素的个数
// 先将非0元素以原来的顺序复制到q.
for (int i=0; i<n; i++) {
if (*p != 0) {
*q = *p;
q++;
notZeroCnt++;
}
p++;
}
// 接下来只需将(n-notZeroCnt)个0复制到q。
for (int i=notZeroCnt; i<n; i++) {
*q = 0;
q++;
}
}