如何在 java 中编写递归方法来反转存储在整数数组中的值?
how to write a recursive method in java to reverse the values stored in an integer array?
我很难弄清楚如何反转存储在我的代码中的整数数组中的值:
private static void randomizeArray (int[] arr, int upperLimit)
{
// Loop to generate and store in array random numbers from 1 to upperLimit
Random rand = new Random();
for (int i = 0; i < arr.length; i++)
arr[i] = rand.nextInt(upperLimit) + 1;
}
private static void printArray (String heading, int[] arr)
{
// Loop to print array numbers
System.out.print(heading + ": [");
for (int i = 0; i < arr.length; i++)
System.out.printf("%3d", arr[i]);
System.out.println("]");
}
private static int[] reverseArray (int[] arr)
{
}
}
有很多方法可以做到这一点。这对于 Stack 来说真的很容易做到,但是还有另一种简单的方法也可以通过将值存储在临时数组中来做到这一点。基本上,您使用 j 作为指向 arr 数组中最后一个位置的指针,并将任何值加载到 tempArray 的前面。在循环的每次迭代之后,我们递减 j 并递增 i,更改它们的指针以继续将 arr 的值以相反的顺序放入 tempArray。希望对您有所帮助。
private static int[] reverseArray (int[] arr)
{
int[] tempArray = new int[arr.length];
int j = arr.length-1;
for(int i = 0; i < arr.length; i++){
tempArray[i] = arr[j];
j--;
}
return tempArray;
}
做这样的事情:
void reverseArray(int[] arr) {
reverse(arr, 0, arr.length - 1);
}
void reverse(int[] arr, int s, int e) {
if(s < e) {
/* swap start and end index elements */
int tmp = arr[s];
arr[s] = arr[e];
arr[e] = tmp;
reverse(arr, ++s, --e);
}
}
递归,不需要任何额外的缓冲区并在 O(n) 中运行。
迭代版本可以是这样的:
int[] reverseArray(int[] arr) {
int startIndex = 0, endIndex = arr.length - 1;
for (int i=startIndex; i<endIndex/2; i++) {
int tmp = arr[i];
arr[i] = arr[endIndex-i];
arr[endIndex-i] = tmp;
}
return arr;
}
private static int[] reverseArray (int[] arr)
{
if(arr.length == 1){
return arr;
}
else{
int temp = arr[0];
int tempArr[] = new int[arr.length-1];
System.arraycopy(arr, 1, tempArr, 0, tempArr.length);
tempArr = reverseArray(tempArr);
System.arraycopy(tempArr, 0, arr, 0, tempArr.length);
arr[arr.length-1] = temp;
return arr;
}
}
要创建递归算法,您需要做两件事。
基本案例
你能合理遇到的最小情况是什么,结果应该是什么?
空数组是自己的反转。不能再小了。
rev( [] ) = []
根据下一步,您可能还需要将单例案例定义为基本案例:
rev( [ r ] ) = [ r ]
感应步骤
给定函数 revn 适用于 "size" <= n[ 的任何输入=63=],对于 "size" 的一些合适定义,您可以使用该函数为 "size" n + 1 的任何输入生成结果吗?
rev( [ r1, ..., rn, rn+1 ] ) = [ rn+1 ] ++ revn( [ r1, ..., r n ] )
或(假设单例也定义为基本情况)
rev( [ r1, ..., rn, rn+1 ] ) = [ rn+1 ] ++ revn( [ r2, ... rn ] ) ++ [ r1 ]
为了编写反转数组的递归程序,您需要:
一个。将数组的第一个元素与最后一个元素交换
b。称呼
上面的子数组没有第一个和最后一个元素
c。停止调用 a - 如果没有剩余元素可交换
考虑以下代码
void reverseArray(int arr[], int start, int end){
int temp;
if(start >= end)
return;
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
rvereseArray(arr, start+1, end-1);
}
此代码不完全适合您的模板,您需要将其调整为 return int[]
我很难弄清楚如何反转存储在我的代码中的整数数组中的值:
private static void randomizeArray (int[] arr, int upperLimit)
{
// Loop to generate and store in array random numbers from 1 to upperLimit
Random rand = new Random();
for (int i = 0; i < arr.length; i++)
arr[i] = rand.nextInt(upperLimit) + 1;
}
private static void printArray (String heading, int[] arr)
{
// Loop to print array numbers
System.out.print(heading + ": [");
for (int i = 0; i < arr.length; i++)
System.out.printf("%3d", arr[i]);
System.out.println("]");
}
private static int[] reverseArray (int[] arr)
{
}
}
有很多方法可以做到这一点。这对于 Stack 来说真的很容易做到,但是还有另一种简单的方法也可以通过将值存储在临时数组中来做到这一点。基本上,您使用 j 作为指向 arr 数组中最后一个位置的指针,并将任何值加载到 tempArray 的前面。在循环的每次迭代之后,我们递减 j 并递增 i,更改它们的指针以继续将 arr 的值以相反的顺序放入 tempArray。希望对您有所帮助。
private static int[] reverseArray (int[] arr)
{
int[] tempArray = new int[arr.length];
int j = arr.length-1;
for(int i = 0; i < arr.length; i++){
tempArray[i] = arr[j];
j--;
}
return tempArray;
}
做这样的事情:
void reverseArray(int[] arr) {
reverse(arr, 0, arr.length - 1);
}
void reverse(int[] arr, int s, int e) {
if(s < e) {
/* swap start and end index elements */
int tmp = arr[s];
arr[s] = arr[e];
arr[e] = tmp;
reverse(arr, ++s, --e);
}
}
递归,不需要任何额外的缓冲区并在 O(n) 中运行。
迭代版本可以是这样的:
int[] reverseArray(int[] arr) {
int startIndex = 0, endIndex = arr.length - 1;
for (int i=startIndex; i<endIndex/2; i++) {
int tmp = arr[i];
arr[i] = arr[endIndex-i];
arr[endIndex-i] = tmp;
}
return arr;
}
private static int[] reverseArray (int[] arr)
{
if(arr.length == 1){
return arr;
}
else{
int temp = arr[0];
int tempArr[] = new int[arr.length-1];
System.arraycopy(arr, 1, tempArr, 0, tempArr.length);
tempArr = reverseArray(tempArr);
System.arraycopy(tempArr, 0, arr, 0, tempArr.length);
arr[arr.length-1] = temp;
return arr;
}
}
要创建递归算法,您需要做两件事。
基本案例
你能合理遇到的最小情况是什么,结果应该是什么?
空数组是自己的反转。不能再小了。
rev( [] ) = []
根据下一步,您可能还需要将单例案例定义为基本案例:
rev( [ r ] ) = [ r ]
感应步骤
给定函数 revn 适用于 "size" <= n[ 的任何输入=63=],对于 "size" 的一些合适定义,您可以使用该函数为 "size" n + 1 的任何输入生成结果吗?
rev( [ r1, ..., rn, rn+1 ] ) = [ rn+1 ] ++ revn( [ r1, ..., r n ] )
或(假设单例也定义为基本情况)
rev( [ r1, ..., rn, rn+1 ] ) = [ rn+1 ] ++ revn( [ r2, ... rn ] ) ++ [ r1 ]
为了编写反转数组的递归程序,您需要:
一个。将数组的第一个元素与最后一个元素交换
b。称呼 上面的子数组没有第一个和最后一个元素
c。停止调用 a - 如果没有剩余元素可交换
考虑以下代码
void reverseArray(int arr[], int start, int end){
int temp;
if(start >= end)
return;
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
rvereseArray(arr, start+1, end-1);
}
此代码不完全适合您的模板,您需要将其调整为 return int[]