#include<bits/stdc++.h> // 包含所有标准库头文件
using namespace std;    // 使用标准命名空间

int n, x, y;           // 定义全局变量:n(数据个数),x(插入位置/临时输入),y(插入值)
vector<int> v;         // 定义整型动态数组v存储数据序列

int main() {
    // 第一部分:读取初始序列
    cin >> n;           // 输入序列长度n
    for (int i = 1; i <= n; i++) {
        cin >> x;       // 循环读取n个整数
        v.push_back(x); // 将每个整数添加到vector末尾
    }
    
    // 第二部分:处理插入操作
    cin >> x >> y;      // 输入插入位置x和插入值y
    // 在指定位置插入(vector索引从0开始,输入位置从1开始计数,故需x-1转换)
    v.insert(v.begin() + (x - 1), y);
    
    // 第三部分:输出结果
    // 注意:插入后序列长度变为n+1,因此循环n+1次(索引0到n)
    for (int i = 0; i <= n; i++) {
        cout << v[i] << " "; // 输出当前元素加空格
    }
    
    return 0;          // 程序正常结束
}

思维解析:

  1. 问题目标 实现一个序列的动态插入操作:先读入初始序列,然后在指定位置插入新元素,最后输出新序列。

  2. 核心逻辑 数据存储:使用vector容器(动态数组)灵活存储可变长度的序列。

位置转换:题目中插入位置从1开始计数(人类习惯),但C++中vector索引从0开始,因此需要x-1转换。

插入操作:通过v.insert(iterator, value)在迭代器指向位置插入元素,原位置及后续元素自动后移。

输出控制:插入后序列长度变为n+1,因此循环边界为0到n(共n+1个元素)。

  1. 关键步骤分解 步骤 操作 说明 1 cin >> n 读取初始序列长度 2 for + push_back 循环读取n个元素并存入vector 3 cin >> x >> y 读取插入位置(人类计数)和插入值 4 v.insert(...) 在索引x-1处插入y,原位置元素后移(时间复杂度O(n),需移动后续元素) 5 for输出0~n 利用插入后长度变为n+1的特性输出新序列
  2. 注意事项 索引转换陷阱:直接使用x会导致插入位置错误(如想插在首位应输入x=1,对应索引0)。

空间变化:插入后vector长度增加,需确保循环边界正确(原代码用i<=n巧妙匹配新长度)。

性能局限:vector插入操作平均时间复杂度O(n),对超大序列可能效率较低(但本题属于基础训练)。

替代思路:若需高效插入,可改用链表(list),但本题数据量不大且需支持随机访问输出,vector更合适。

0 条评论

目前还没有评论...