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

使用std::rotate反向迭代器实现数组右旋转时遇堆溢出求助

LeetCode Rotate Array 堆溢出问题排查

我在解决LeetCode的Rotate Array问题,需要将vector<int>右旋转k个位置。由于std::rotate默认是左旋转,我尝试用反向迭代器实现右旋转,代码如下:

void rotate(vector<int>& nums, int k) 
{
    std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());
}

这段代码通过了前两个测试用例,但提交后出现堆溢出(heap-overflow)错误,错误信息如下:

=21==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000034c at pc 0x000000369815 bp 0x7fff32cde700 sp 0x7fff32cde6f8
READ of size 4 at 0x60200000034c thread T0
    #3 0x7f55da0cc082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x60200000034c is located 4 bytes to the left of 4-byte region [0x602000000350,0x602000000354)

请问是我的代码存在问题,还是LeetCode平台本身的问题?


问题原因与修复

问题出在你的代码中,未处理k大于数组长度的情况。当k >= nums.size()时,nums.rbegin() + k会超出反向迭代器的合法访问范围,导致越界访问堆内存,触发堆溢出错误。

比如数组长度为3、k为5时,nums.rbegin() +5对应的正向位置是数组起始位置之前2个元素的区域,属于非法内存。

修复方法是先对k取模,确保k落在[0, nums.size())范围内,同时处理k=0的情况(无需旋转):

void rotate(vector<int>& nums, int k) 
{
    k = k % nums.size();
    if (k == 0) return;
    std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());
}

取模操作后,k的取值范围被限制在合法区间内,nums.rbegin() +k不会再越界,就能避免堆溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:57:54