程序要求:给定由 nn 个数组成的数列,其中相邻的两个数字如果相同就可以相互消除,然后后面的数字按照顺序向前移动填补空位,填补之后如果依然出现相邻数字相同,则继续消除并移动,直至不存在能相互消除的数字为止。请写出C++代码
时间: 2024-05-22 10:16:46 浏览: 108
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int)); // 动态分配数组空间
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int i = 0; // i 为当前处理的位置
while (i < n) {
int j = i + 1; // j 为下一个不同的位置
while (j < n && arr[j] == arr[i]) {
j++;
}
if (j - i > 1) { // 存在相邻的相同数字
for (int k = j; k < n; k++) { // 后面的数字向前移动
arr[k - j + i] = arr[k];
}
n -= j - i; // 更新数组长度
i = i > 0 ? i - 1 : 0; // 回退一步重新检查前一个数字
} else { // 不存在相邻的相同数字
i++;
}
}
for (int i = 0; i < n; i++) { // 输出最终结果
printf("%d ", arr[i]);
}
free(arr); // 释放数组空间
return 0;
}
阅读全文