首页 > 解决方案 > 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;
    }

如果您需要更多信息,请告诉我。

标签: javaarraysalgorithm

解决方案


尝试简化数学几乎没有什么好处,如果它导致程序更难编写 - 特别是因为您根本不想旋转数组,并且可以简单地将正确的值直接放在正确的位置。

如果 element 的旧位置ii,在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;
}

注意:代码未经测试


推荐阅读