【问题标题】:HackerRank Left Rotation in JavaJava中的HackerRank左旋转
【发布时间】: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 &lt; 0,然后是d - a.length &gt; 0,为什么使用Math.abs 过于复杂?
  • 您应该在帖子中以文本形式提供问题,而不是仅通过链接。
  • 您的代码返回一个不存在的变量 newArray 并且不对 a 数组执行任何操作。关于我的第一条评论,您检查了前一行,您知道结果将是负面的,为什么您不确定它是正面还是负面?
  • 你不需要计算一个新的数组。直接写结果,顺次读取已有数组
  • 你已经有了这样的想法,你不必将数组向左旋转,也不必将数组旋转给定的次数,只要你结束达到同样的效果。现在你需要明白你根本不需要“旋转”。创建一个新数组,并在新数组中的每个位置,从旧数组的正确位置复制元素。

标签: java arrays algorithm


【解决方案1】:

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

如果元素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;
}

注意:代码未经测试

【讨论】:

  • 这里有几件事:1)在java中数组有一个prop长度。他们不调用长度方法。无论如何,这只是一个仅供参考。 2) 在这种情况下,n 是多少?我假设你在 for 循环中的迭代器应该是: s=(s+1)%d 对吗?我也喜欢这个解决方案。它与我搜索的解决方案不同。看看其他编码风格很有趣。
  • 修正错别字。 % a.length 会在达到数组限制时进行环绕 - a % d 将不起作用。最初,s = t+d:这是唯一需要 d 的地方,以提供源位置和目标位置之间的初始偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多