如何修复此代码,以便Java为大型数组和大量旋转旋转数组?



以下代码用于整数数组的旋转。 获取数组大小的用户输入,然后获取数组要旋转到的元素的输入。

不适用于数组大小和旋转元素的大值。

以下代码适用于 15 个数组元素并旋转 11 个数字(我没有尝试更高的数字(,但对于 77 个数组元素和旋转 69 个数字,它失败了。 它适用于排序和未排序数组。 为什么它不起作用,我该如何解决这个问题?

int dupRotate = D;
for(int j=N-1; j>=0; --j) {
/* checks whether loop is to be stopped or not.
bottom condition fails to stop the 1st iteration for 
third loop run.
*/     
if(dupRotate == 0) {
break;
}
/* Exchanges elements here.
for loop run1 - 
arr = 1,2,3,4,5
after j reaches index 1
arr = 2,3,4,5,1.
for loop run2 -
arr = 2,3,4,5,1.
after j reaches index 1
arr = 3,4,5,1,2.
*/ 
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
/* if j reaches 1
decrements dupRotate and sets j = N 
then for loop decrements j and starts loop again.
*/     
if(j == 1 && dupRotate > 0) {
dupRotate--;
j = N;
}
}
77 69
40 13 27 87 95 40 96 71 35 79 68 2 98 3 18 93 53 57 2 81 87 42 66 90 45 20 41 30 32 18 98 72 82 76 10 28 68 57 98 54 87 66 7 84 20 25 29 72 33 30 4 20 71 69 9 16 41 50 97 24 19 46 47 52 22 56 80 89 65 29 42 51 94 1 35 65 25

其正确输出为:

29 42 51 94 1 35 65 25 40 13 27 87 95 40 96 71 35 79 68 2 98 3 18 93 53 57 2 81 87 42 66 90 45 20 41 30 32 18 98 72 82 76 10 28 68 57 98 54 87 66 7 84 20 25 29 72 33 30 4 20 71 69 9 16 41 50 97 24 19 46 47 52 22 56 80 89 65

代码的输出为:

45 20 41 30 32 18 98 72 82 76 10 28 68 57 98 54 87 66 7 84 20 25 29 72 33 30 4 20 71 69 9 16 41 50 97 24 19 46 47 52 22 56 80 89 65 29 42 51 94 1 35 65 69 40 13 27 87 95 40 96 71 35 79 68 2 98 3 18 93 53 57 2 81 87 42 66 90

很难意识到你的问题。我必须添加更多描述。

我认为,如果您使用正确的数组旋转算法,那么它不依赖于数组的长度。这是最有效的算法之一:

[1,2,3,4,5] -> k = 2 -> [4,5,1,2,3]
-----------------------------------
1. [1,2,3,4,5] -> [5,4,3,2,1] 
2. [5,4,3,2,1] -> [4,5,3,2,1]
3. [4,5,3,2,1] -> [4,5,1,2,3]

public static void rotate(int[] arr, int k) {
if ((k %= arr.length) != 0) {
k = k < 0 ? arr.length + k : k;
swapSubArr(arr, 0, arr.length);               // 1.
swapSubArr(arr, 0, arr.length - k);           // 2.
swapSubArr(arr, arr.length - k, arr.length);  // 3.
}
}
private static void swapSubArr(int[] arr, int from, int to) {
for (int i = from, j = to - 1; i < j; i++, j--)
swap(arr, i, j);
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}

一步一步地移动

[1,2,3,4,5] -> k = 3 -> [4,5,1,2,3]
-----------------------------------
1. [1,2,3,4,5] -> [5,4,3,2,1] 
2. [5,4,3,2,1] -> [4,5,3,2,1]
3. [4,5,3,2,1] -> [4,5,1,2,3]

法典

static void rotate(int arr[], int k) {
for (int i = 1; i <= k; i++) {
move(arr);
}
}
static void move(int arr[]) {
int i, n, tmp;
n = arr.length;
tmp = arr[0];
for (i = 0; i < n - 1; i++) {
arr[i] = arr[i + 1];
}
arr[i] = tmp;
}
public static void main(String[] args) {
int arr[] = { 1, 2, 3, 4, 5 };
int k = 3;
// [1, 2, 3, 4, 5]
rotate(arr, k);
// [4, 5, 1, 2, 3]
}

最新更新