使用C++指针交换两数组指定元素 实现删除输入数值后矩阵末尾补0
实现方案
核心逻辑说明
你的需求本质是删除3行4列矩阵中第一个匹配输入值的元素,后续所有元素依次向前移动1位,矩阵末尾补0。利用C++二维数组内存连续存储的特性,直接通过指针操作即可实现,不需要额外定义全零矩阵做交换,效率更高。
原有代码问题
- 缺少必要头文件
<iostream>,且using namespace std声明位置错误,应当放在头文件引入之后 - 未实现元素查找、前移、补0的核心逻辑,且存在语法逻辑错误:比如
if (arr[i][0] = i)是赋值操作不是等值判断,输入读取逻辑位置错误 - 额外定义全零矩阵的方案没有必要,会增加不必要的内存开销
优化后指针实现代码
#include <iostream> #include <iomanip> using namespace std; int main() { int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int *ptr = &arr[0][0]; const int TOTAL_ELE = 3 * 4; // 矩阵总元素数 int target; // 输出原矩阵 cout << "原矩阵:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { cout << setw(4) << arr[i][j]; } cout << endl; } // 读取要删除的元素 cout << "请输入要删除的数值:"; cin >> target; // 用指针查找第一个匹配的元素位置 int *pos = nullptr; for (int i = 0; i < TOTAL_ELE; i++) { if (*(ptr + i) == target) { pos = ptr + i; break; } } // 找到匹配元素后执行前移+补0 if (pos != nullptr) { // 后续元素前移1位 for (int *p = pos; p < ptr + TOTAL_ELE - 1; p++) { *p = *(p + 1); } // 末尾补0 *(ptr + TOTAL_ELE - 1) = 0; } // 输出处理后的矩阵 cout << "处理后矩阵:" << endl; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { cout << setw(4) << arr[i][j]; } cout << endl; } return 0; }
代码说明
- 全程通过指针操作内存,空间复杂度为O(1),仅需要常量额外空间,比双数组交换的方案内存开销更低
- 遍历仅需两轮(一轮查找、一轮前移),时间复杂度为O(n)(n为矩阵元素总数),是该需求下的最优时间复杂度
- 输入3后运行结果和你要求的输出完全一致:原矩阵的3被删除,后续元素前移,最后一位补0
内容的提问来源于stack exchange,提问作者Ali Osman
相关产品推荐
相关产品推荐

