我试图在将原始数组作为参数提供给函数后用结果数组更新数组。我不知道如何实现这一目标。我还没有涵盖所有材料,我需要你的帮助。所以我想要实现的目标:
原始数组:[1,2,3,4,5,6]
n = 3 其中n是数组元素向右移动的次数
移位阵列:[4,5,6,1,2,3]
我创建了一个移位1个位置的方法。我有另一种方法来切换N个位置,我将方法切换为1个位置。它将数组切换一次,但后来我无法使用移位结果更新原始数组。所以不要得到:
Original array: [1, 2, 3, 4, 5, 6]
RIGHT SHIFT: [6, 1, 2, 3, 4, 5]
RIGHT SHIFT: [5, 6, 1, 2, 3, 4]
RIGHT SHIFT: [4, 5, 6, 1, 2, 3] --> **final result** <br>
我明白了:
Original array: [1, 2, 3, 4, 5, 6]
RIGHT SHIFT: [6, 1, 2, 3, 4, 5]
RIGHT SHIFT: [6, 1, 2, 3, 4, 5]
RIGHT SHIFT: [6, 1, 2, 3, 4, 5]
我的代码:
public class Shift {
public static int[] rotate(int[] seq){
int[] origArr = seq;
int[] shiftedArrR = new int[seq.length];
for (int i = 0, j = i+1; j < origArr.length; i++, j++) {
shiftedArrR[j] = origArr[i];
}
shiftedArrR[0] = origArr[origArr.length-1];
System.out.print("RIGHT SHIFT: ");
System.out.println(java.util.Arrays.toString(shiftedArrR));
return shiftedArrR;
}
public static void rotate(int[] seq, int times){
System.out.println(java.util.Arrays.toString(seq));
int[] temp = new int[seq.length];
for (int i = 1; i <= times; i++) {
temp = rotate(seq);
}
}
// ------------ MAIN METHOD ----------------
public static void main(String[] args) {
System.out.print("Original array: ");
rotate(new int[]{1,2,3,4,5,6}, 3);
}
}
显然,旋转(seq)的结果未分配给提供给rotate()方法的seq,而该方法应该将其移位更多次。 我知道这很简单,我尝试了不同的方法来解决这个问题,但没有运气。
答案 0 :(得分:2)
您在3次迭代中使用未更改的数组(seq)而不是此处更改的数组(temp)
for (int i = 1; i <= times; i++) {
temp = rotate(seq);
}
答案 1 :(得分:2)
您正在调用rotate(int[] seq)
方法正确的次数,但每次传入原始未经修改的&#39; seq&#39;数组,而不是前一轮的输出。
此外,当您使用int[] temp = new int[seq.length];
创建临时数组时,您实际上从未对您创建的新数组执行任何操作 - 它永远不会被读取,并且只是替换为由其返回的另一个新数组(shiftedArrR)旋转方法..
解决此问题的一种方法就是抛弃temp
数组,并用seq = rotate(seq);
替换循环内的行。
另一种方法是修改原始的rotate方法,使其实际覆盖传入的数组的内容,而不是返回一个新的数组。
答案 2 :(得分:1)
public static void rotate(int[] seq, int times){
System.out.println(java.util.Arrays.toString(seq));
for (int i = 1; i <= times; i++) {
seq = rotate(seq);
}
}
用此代码替换您的rotate方法。你总是用旋转(seq)旋转相同的数组。因为你将它保存在temp中你有问题用seq而不是temp调用方法。因此将for循环的内容更改为seq = rotate(seq);
。这会将第二个旋转方法的输出保存在您再次传递给方法
答案 3 :(得分:1)
主要是在每次迭代中使用未更改的数组而不是更改的数组。
你的rotate(int [] seq)函数看起来也很混乱。所以我稍微更新一下。[以最简单的方式]。也无需创建额外的临时变量来存储数组。
public class RightShift {
public static void rotate(int[] seq){
int temp = seq[seq.length - 1];
for(int i = seq.length -1 ; i>0; --i)
seq[i] = seq[i-1];
seq[0] = temp;
System.out.println("RIGHT SHIFT: ");
System.out.println(java.util.Arrays.toString(seq));
}
public static void rotate(int[] seq, int times){
System.out.println(java.util.Arrays.toString(seq));
for (int i = 1; i <= times; i++) {
rotate(seq);
}
}
// ------------ MAIN METHOD ----------------
public static void main(String[] args) {
System.out.print("Original array: ");
// rotate(new int[]{1,2,3,4,5,6});
rotate(new int[]{1,2,3,4,5,6}, 3);
}
}
答案 4 :(得分:0)
与大多数人提到的一样,阵列没有发生变异。无论如何,更简单的方法是只编写一种旋转方法
import java.util.Arrays;
public class Shift {
public static int[] rotate(int[] seq, int times){
int temp = 0;
int round = 0;
while (round <times) {
for(int i=0;i<seq.length;i++) {
if(i == seq.length-1) {
seq[seq.length-1] = temp;
break;
}
if(i == 0)
temp = seq[i];
seq[i]=seq[i+1];
}
round++;
}
System.out.println("Rotated array: " +Arrays.toString(seq));
return seq;
}
// ------------ MAIN METHOD ----------------
public static void main(String[] args) {
int[] original = new int[]{1,2,3,4,5,6};
System.out.println("Original array: " + Arrays.toString(original));
rotate(new int[]{1,2,3,4,5,6}, 3);
}
}