Java中的HackerRank左旋转

Java中的HackerRank左旋转,java,arrays,algorithm,Java,Arrays,Algorithm,我昨天查阅了这个问题的解决方案,今天试图自己解决,但发现自己试图用另一种方式解决这个问题。我觉得我可能把问题复杂化了,但我仍然想知道我可能的解决方案的答案,因为它让我感到困扰(我相信每个人都在某个时候经历过这种情况)。无论如何,问题是: 我的想法是,首先检查数组长度是否等于所需的旋转数,然后返回原始值。不需要做任何工作 我的下一个想法是检查旋转是否大于数组长度。如果是这种情况,我们可以进行旋转-数组长度或ABS值(数组长度-旋转),这会给出相同的结果。我们可以将此值重新分配给D 接下来,我们可

我昨天查阅了这个问题的解决方案,今天试图自己解决,但发现自己试图用另一种方式解决这个问题。我觉得我可能把问题复杂化了,但我仍然想知道我可能的解决方案的答案,因为它让我感到困扰(我相信每个人都在某个时候经历过这种情况)。无论如何,问题是:

我的想法是,首先检查数组长度是否等于所需的旋转数,然后返回原始值。不需要做任何工作

我的下一个想法是检查旋转是否大于数组长度。如果是这种情况,我们可以进行旋转-数组长度或ABS值(数组长度-旋转),这会给出相同的结果。我们可以将此值重新分配给D

接下来,我们可以创建一个向右旋转而不是向左旋转的案例。当您的旋转大于数组长度/2时,我们不会向左旋转,因为我们正在做额外的工作。相反,我们希望向右旋转。例如:

数组长度4 旋转3(左)

我们可以简单地向右旋转一次,而不是向左旋转三次。我们可以将rotateRight布尔值设置为true(否则设置为false,表示rotateLeft为正常值)

不管怎么说,这就是我被抓住的部分。我不确定如何在这里旋转我的元素。我正在考虑返回一个新阵列。如何获得新数组的正确值?我面临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;
    }
静态int[]旋转左(int[]a,int[]d){
int aLength=a.长度;
int计数器=0;
int[]newArray=newint[aLength];
布尔旋转右=假;
if(aLength==d){
返回a;
}
如果(a.长度-d<0){
d=数学绝对值(a.长度-d);
}
如果(d>a.length/2){
旋转右=真;
}
返回新数组;
}

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

如果简化数学运算会导致编写程序变得更困难,那么这样做没有什么好处,尤其是因为您根本不想旋转数组,只需直接将正确的值放置在正确的位置

如果元素
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;
}
静态int[]旋转左(int[]a,int[]d){
int[]b=新的int[a.长度];

对于(int s=d,t=0;tif
a.length-d<0
,那么
d-a.length>0
,为什么要使用Math.abs过于复杂呢?你应该在帖子中以文本的形式提供问题,而不仅仅是通过链接。你的代码返回一个不精确的变量
newArray
,并且不对
a
数组做任何事情。关于我的第一条评论,你可以在前一行,你知道结果是负数,为什么你不确定它是正数还是负数?你不需要计算一个新的数组。直接写下结果,以良好的顺序读取现有数组。你已经有了这样的想法,你不必向左旋转数组,也不必旋转数组e数组给定的次数,只要你得到相同的效果。现在你需要知道你根本不需要“旋转”。制作一个新数组,在新数组的每个位置,从旧数组的适当位置复制元素。好的,这里有几件事:1)在java中,数组有一个prop length。它们不调用length方法。总之,这只是一个参考。2)在这种情况下,n是什么?我假设for循环中的迭代器应该是:s=(s+1)%d是正确的吗?我也喜欢这个解决方案。它与我在谷歌上搜索的解决方案不同。看到其他编码样式很有趣。修复了打字错误。
%a.length
在达到数组限制时会自动换行-
a%d
不会起作用。最初,
s=t+d
:这是唯一的
d,以提供源位置和目标位置之间的初始偏移。