You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:04