【发布时间】:2020-10-09 12:29:22
【问题描述】:
我昨天查找了这个问题的解决方案,今天尝试自己解决,但发现自己试图以不同的方式解决这个问题。我觉得我可能使问题过于复杂,但我仍然想要一个可能的解决方案的答案,只是因为它让我不知道(我相信每个人都在某个时候经历过这个)。无论如何,这是问题所在: 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,表示正常旋转)
无论如何,这是我被抓住的部分。我不确定如何在这里旋转我的元素。我正在考虑返回一个新数组。如何获得新数组的正确值?我面临 IndexOutOfBounds 异常的问题。在这个例子中我也可以使用 try catch 吗?还是有点矫枉过正?
这是我目前拥有的代码,它应该符合我上面的想法:
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;
}
如果您需要更多信息,请告诉我。
【问题讨论】:
-
如果是
a.length - d < 0,然后是d - a.length > 0,为什么使用Math.abs 过于复杂? -
您应该在帖子中以文本形式提供问题,而不是仅通过链接。
-
您的代码返回一个不存在的变量
newArray并且不对a数组执行任何操作。关于我的第一条评论,您检查了前一行,您知道结果将是负面的,为什么您不确定它是正面还是负面? -
你不需要计算一个新的数组。直接写结果,顺次读取已有数组
-
你已经有了这样的想法,你不必将数组向左旋转,也不必将数组旋转给定的次数,只要你结束达到同样的效果。现在你需要明白你根本不需要“旋转”。创建一个新数组,并在新数组中的每个位置,从旧数组的正确位置复制元素。