You need to enable JavaScript to run this app. C++使用vector实现数组左旋d个元素的代码问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C++使用vector实现数组左旋d个元素的代码问题咨询

C++数组左旋代码问题分析与修复

现存代码的核心问题

  • 临时数组越界访问:代码中定义的vector<int> temp是默认构造的空容器,未分配任何存储空间,直接使用下标temp[i]赋值属于未定义行为,运行时大概率直接崩溃。
  • 元素回存下标逻辑错误:最后一个循环中arr[n-d-k]的下标计算完全错误,以测试用例n=5、d=4为例,n-d=1,k从0到3时得到的下标依次为1、0、-1、-2,不仅输出结果不符合预期,还会触发数组越界。
  • 边界情况未处理:未考虑d大于数组长度n的场景,此时d超过数组长度会做无用功,甚至触发越界问题。

修正后的代码实现

vector<int> rotateLeft(int d, vector<int> arr) 
{
    int n = arr.size();
    // 边界值提前返回,避免无效运算
    if (n <= 1 || d <= 0) return arr;
    // 对d取模,兼容d大于n的场景
    d = d % n;
    // 初始化临时数组容量为d,解决越界问题
    vector<int> temp(d); 
    for(int i = 0; i < d; i++)
    {
        temp[i] = arr[i];
    }
    // 数组后半段元素左移到头部
    for(int j = d; j < n; j++)
    {
        arr[j - d] = arr[j];
    }
    // 临时数组元素补到数组尾部,修正下标逻辑
    for(int k = 0; k < d; k++)
    {
        arr[n - d + k] = temp[k];
    }
    return arr;
}

测试用例验证

给定输入arr = [1,2,3,4,5]、d=4时:

  1. 取模后d仍为4,临时数组temp存储前4个元素[1,2,3,4]
  2. 数组后半段仅存的元素5左移到下标0位置,此时arr变为[5,2,3,4,5]
  3. 临时数组的4个元素依次写入下标1、2、3、4位置,最终输出[5,1,2,3,4],完全符合预期。

内容的提问来源于stack exchange,提问作者sam2611

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:15:04