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时:
- 取模后d仍为4,临时数组temp存储前4个元素
[1,2,3,4] - 数组后半段仅存的元素5左移到下标0位置,此时arr变为
[5,2,3,4,5] - 临时数组的4个元素依次写入下标1、2、3、4位置,最终输出
[5,1,2,3,4],完全符合预期。
内容的提问来源于stack exchange,提问作者sam2611
相关产品推荐
相关产品推荐

