我正在尝试解决 this leetcode 问题,其中我应该对向量执行 k 个位置的右旋转。由于 std::rotate 进行左旋转,我尝试使用反向迭代器来完成相反的结果:
void rotate(vector<int>& nums, int k)
{
std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());
}
现在这适用于前 2 个测试用例,但是当我提交它时,我收到一个运行时错误,说我有堆溢出,这是错误:
=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平台本身的问题,我会删除这个问题。
如果要旋转的位置数超过向量的大小,您的代码将会失败。
std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());
如果
k >= nums.size()
,那么 nums.rbegin() + k
将是一个无效的迭代器,因此会出现您所看到的运行时错误。
解决方法是根据向量的大小旋转
k
的模数,而不是实际 k
的位置。
std::rotate(nums.rbegin(), nums.rbegin() + k % nums.size(), nums.rend());
例如,如果
nums.size()
为 10,且 k
为 20、30、40,则模数将产生 0,因此不会进行实际旋转。另一方面,如果 k
为 21、22 等,则将完成 1、2 等的实际旋转。