java - Java中的HackerRank左旋转
问题描述
我昨天查找了这个问题的解决方案,今天尝试自己解决,但发现自己试图以不同的方式解决这个问题。我觉得我可能使问题过于复杂,但我仍然想要我可能的解决方案的答案,只是因为它让我不知道(我相信每个人都曾在某些时候经历过这种情况)。无论如何,这是问题所在: https ://www.hackerrank.com/challenges/ctci-array-left-rotation/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=arrays
我的想法是,您将首先检查您的数组长度是否等于您想要的旋转,然后您只需返回原始数组。不需要做任何工作。
我的下一个想法是检查我们的旋转是否大于我们的数组长度。如果是这种情况,我们可以进行旋转 - 数组长度或 ABS VALUE(数组长度 - 旋转),这给了我们相同的结果。我们可以将此值重新分配给 D。
接下来,我们可以创建一个向右而不是向左旋转的案例。当您的旋转大于您的数组长度/ 2 时,我们不会向左旋转,因为我们正在做额外的工作。相反,我们想要向右旋转。例如:
阵列长度 4 旋转 3(左)
我们可以简单地向右旋转一次,而不是向左旋转 3 次。我们可以将 rotateRight 布尔值设置为 true(否则设置为 false,表示正常 rotateLeft)
无论如何,这是我被抓住的部分。我不确定如何在这里旋转我的元素。我正在考虑返回一个新数组。如何获得新数组的正确值?我面临 IndexOutOfBounds 异常的问题。我也可以在这个例子中使用 try catchs 还是有点矫枉过正?
这是我目前拥有的代码,它应该符合我上面的想法:
static int[] rotLeft(int[] a, int d) {
int aLength = a.length;
int counter = 0;
int[] newArray = new int[aLength];
boolean rotateRight = false;
if (aLength == d) {
return a;
}
if (a.length - d < 0) {
d = Math.abs(a.length - d);
}
if(d > a.length/2) {
rotateRight = true;
}
return newArray;
}
如果您需要更多信息,请告诉我。
解决方案
尝试简化数学几乎没有什么好处,如果它导致程序更难编写 - 特别是因为您根本不想旋转数组,并且可以简单地将正确的值直接放在正确的位置。
如果 element 的旧位置i
是i
,在d
一个大小为 的数组左旋转后len
,它的新位置将是(i-d)%len
。如果d == len+1
这确实等同于(i+1)%len
- 对人类来说更容易,但计算机计算任何一个表达式都一样愉快。
所以建议的代码是:
static int[] rotLeft(int[] a, int d) {
int[] b = new int[a.length];
for (int s=d, t=0; t<a.length; s++, t++) {
// t is target position; s is source position
b[t] = a[s%a.length];
}
return b;
}
注意:代码未经测试