我已经编写了将数组旋转k次的代码。在这种情况下,当我添加i=0时,它显示“arrayoutofbounds”异常,当我将i的值更改为1时,它显示错误的输出。为什么会出现这种例外?我有没有办法更正这个代码?
public void rotate(int[] nums, int k)
{ int j=0, temp=0;
for(j=0;j<k;j++)
{
for(int i=0;i<nums.length;i++)
{
temp=nums[i-1];
nums[i-1]=nums[i];
nums[i]=temp;
}
}
}
}
2条答案
按热度按时间rpppsulh1#
编辑(来自上面的评论):如果我是0,你试图得到一个-1的索引,这将引发arrayoutofbounds异常。如果我从1开始,那么你不是在处理第一个数字。
以下是可用于向右旋转整数的函数:
让我简单解释一下它的作用。这是最著名的算法之一:杂耍。将数组划分为n个集合,其中n表示数组长度的最大公约数和要旋转的次数。然后,在集合中移动数字。
就时间而言,这可能是最有效的(因为它的时间复杂度是o(n))。
dy2hfwbg2#
在
i=0
您正在尝试访问nums[i-1]
=num[-1]
这是一个无效的位置,因此ArrayOutOfBound
异常被抛出。因此,修改后的版本将是:
但上面的命令会将阵列旋转
k
走向未来的时代left
不正确,因为您正在向左移动元素。所以,为了得到right
旋转需要将元素从数组的末尾移动。比如: