【问题标题】:Java, recursively reverse an arrayJava,递归地反转数组
【发布时间】:2012-10-20 10:47:56
【问题描述】:

我没有找到任何符合我的功能的特定需求来执行此操作,是的,它是用于家庭作业的。

所以我有:

public void reverseArray(int[] x) {

}

前提条件:x.length > 0

我不能让函数返回任何东西,唯一的参数是一个数组,这让我很困惑。

我尝试过使用循环和递归,但我尝试过的一切似乎都以生成函数的无限实例而告终。

我已经有了一个想法/建议,可以将另一个函数与这个函数一起使用,但是,目前如何递归地使用原始函数是我无法做到的。

感谢任何帮助。

【问题讨论】:

  • 您可以在您的方法中更改数组中的数据。在不返回任何内容的方法中反转数组并没有错。最好发布您的想法,我们很乐意从那里为您提供建议(而不是代码)。
  • 顺便问一下,你能不能给你的reverseArray方法加一个参数?
  • 我们不能添加另一个参数,如果是这样,我知道我会怎么做。是的,帮助方法被认为是一个可行的选择,我只是不确定如何实现。
  • @HotLicks,我认为禁止使用额外的参数。
  • 如果你不能有任何额外的参数(并且你不能在数组中有额外的元素来充当参数)并且你不能创建数组的副本,那么你不能这样做它。如果您可以制作副本(并使用 System.arraycopy),那么您可以通过传递越来越短的数组副本来做到这一点。

标签: java arrays reverse void


【解决方案1】:

伪代码

function revarray(a[1...n])
  if a.length == 1 or a.length == 0
    do nothing 
  # return a
  else
     swap a[1] and a[n]
     revarray(a[2...n-1])
  # return a (The function will not return anything but the contents of a are changed)

【讨论】:

  • @Thilo -- 您没有正确阅读代码 -- 这是一个“无效”函数。
  • 这是一个显而易见的解决方案,但在 Java 中,它需要构造一个新数组并使用 System.arraycopy 向/从它复制,因此比伪代码建议的要复杂几行。
  • 为什么这个答案被标记了?这与 Yogendra Singh 的(后来的)建议相同,该建议目前已获得 +2。
  • 我不知道为什么它被标记下来。因为这是我猜的第一个答案。
  • 为什么@Thilo 的评论即使是错误的也得到了+6??
【解决方案2】:

如果我正在编写此代码,我将为递归调用创建一个临时数组(可能删除了一个元素?),并在从函数返回之前将元素复制回原始数组。您还需要找到一个基本案例来终止递归。

【讨论】:

  • +1 传递给 reverseArray 的临时数组将每一步短一个元素(因此递归在 N 步后终止)。
  • @Thilo 我认为我的原始答案有太多细节,所以我重写了它。
  • 我有这个想法,我只是不确定如何早先实现它,我想我现在可能已经弄清楚了。将一个精简的数组(删除第一个和最后一个元素)传递到函数的新实例中,直到长度为 2,切换它们,(如果长度 == 1,什么都不做),然后从那里开始,在每一端一个实例,添加已移除的元素,但已切换?
  • 这让我走上了正确的道路,却没有告诉我具体该怎么做,非常感谢。
  • @dabbertorres 我只想删除第一个或最后一个元素。我喜欢你的想法,将两者都删除并切换它们。
【解决方案3】:

试试下面的方法:

public void reverseArray(int[] x) {
    if(x.length ==2){
      //if two elements, swap them
      int first = x[0];
      x[0] = x[1];
      x[1] = first;
    }else if(x.length > 2){
      //swap first and last
      int first = x[0];
      x[0]= x[x.length-1];
      x[x.length-1] = first;
      //create a copy of middle elements
      int [] copy = new int[x.length-2];
      System.arraycopy( x, 1, copy, 0, x.length-2);
      //recursive call for middle elements
      reverseArray(copy);
      //place the reversed elements back in the original array
      System.arraycopy( copy, 0, x, 1, copy.length);
    }
}

【讨论】:

  • 与@Pogo的提议基本一致。
  • 虽然它有效,但这种反转非常效率低下,因为正在创建和读取许多子数组。这使得运行时间从 0(n) 变为 0(n^2)!
【解决方案4】:
void reverseArray(int[] x){
   reverse(x, 0, x.length -1);
}

void reverse(int[] x, int i, int j){
    if(i<j){//Swap
       int tmp = x[i];
       x[i] = x[j];
       x[j] = tmp;
       reverse(x, ++i, --j);//Recursive
    }   
}

测试:

int[] s = new int[]{1,2,3,4,5};
reverseArray(s);
System.out.println(Arrays.toString(s));//"5,4,3,2,1"

递归,O(n),不需要临时数组。

【讨论】:

  • 上述内容不符合您不能有任何额外参数的限制(某些人认为)。但这对我来说是最明显的解决方案(也是我上面建议的解决方案)。
【解决方案5】:

因为这是你的作业,我建议一个例子:

给定序列:1 2 3 4 5 6 7 8 9 10

您可以更改为:10 2 3 4 5 6 7 8 9 1

之后:10 9 3 4 5 6 7 8 2 1

.....

如您所见,一步一步,序列“更好”,问题“更小”。所以,你应该解决的问题是:

1) 如何对该方法应用递归调用。对于原文,方法是:reverse(int[] a)。所以,在第一步之后,你应该创建数组b from a[2] --&gt; a[n-1]。并使用 reverse(int[] b)`。

2) 在反转b 之后,我们应该怎么做来反转a?再次将 b 的值赋回 a。

3) 停止条件:什么停止条件?您会看到数组 b 的元素小于数组 a 的元素。那么,我们应该停到哪一步呢?

希望有帮助:)

【讨论】:

  • 我再次编辑了不使用辅助函数的解决方案。如果我们使用辅助函数会更好。但是,我不认为你的老师会喜欢这个:)
【解决方案6】:

由于没有声明不能使用循环:

void reverseArray(int[] x) {
    if (x != null) {
        for (int i = 0; i < length.x / 2; i++) {
            int j = (length.x - 1) - i;
            int temp = x[i];
            x[i] = x[j];
            x[j] = temp;
         }
         reverseArray(null);
     }
}

可能是最快的。

【讨论】:

  • @NullUserException -- 当我上大学时,使用计算机有时被认为是作弊。什么都行!
  • 哈哈,是的,根据我写的,这是可以接受的,但实际问题确实说没有循环。要是……
  • 它是递归的。看到reverseArray(null); 电话了吗?
  • 方法调用是递归的,但实际操作不是。
【解决方案7】:

//我们这里只是做一个操作,调用一个辅助方法。

public void reverseArray(int[] nums){
  int[] hold = new int[nums.length]; //just so it will take this argument
  int[] reversed = recurReverseArray(nums, hold, nums.length - 1, 0);
  nums = reversed; //not returning just changing nums to be reversed.
}
public int[] recurReverseArray(int[] nums, int[] reverse, int end, int start){
  if(end == 0 && start == nums.length - 1){
  reverse[start] = nums[end];
  return reverse; //the way out.
  }
  reverse[start] = nums[end];
  return recurReverseArray(nums, reverse, end - 1, start + 1);
}

【讨论】:

    【解决方案8】:

    这里是主要方法:

    package main;
    
    public class Main {
        public static void main(String[] args) {
            StringOps ops = new StringOps();
            String string = "Arjun";
            // reversing the string recrusively
            System.out.println(ops.reverseRecursively(string.toCharArray(), 0));
        }
    }
    

    这里是递归函数:

    package main;
    
    public class StringOps {
        public char[] reverseRecursively(char[] array, int i) {
            char[] empty = new char[0];
            if (array.length < 1) {
                System.out.println("you entered empty string");
                return empty;
            }
            char temp;
            temp = array[i];
            array[i] = array[array.length - 1 - i];
            array[array.length - 1 - i] = temp;
            i++;
    
            if (i >= array.length - 1 - i) {
                return array;
            } else {
                reverseRecursively(array, i);
                return array;
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案9】:
      public class FunWithAlgorthims {
      
      
      public static void main(final String[] args) {
      
          String[] array = {"a", "b", "c", "d"};
          printArray(array);
          revereArrayRecusrive(array, 0);
          printArray(array);
      }
      
      
      public static void revereArrayRecusrive(final String[] array, int startPointer) {
          if (startPointer >= (array.length / 2)) {
              return;
          }
          String temp = array[startPointer];
          array[startPointer] = array[array.length - 1 - startPointer];
          array[array.length - 1 - startPointer] = temp;
          revereArrayRecusrive(array, ++startPointer);
      }
      
      public static void printArray(final String[] array) {
          Arrays.stream(array).forEach(a -> System.out.print(a + " "));
          System.out.println();
      }
      

      }

      【讨论】:

        【解决方案10】:

        这可能是最简单的方法,不是最快的,但可能是最简单的。

        整个程序如下所示:

        public static void main(String [] args)
        {
            BackwardsArray back = new BackwardsArray();
        }
        
        public BackwardsArray()
        {
            int [] a = {1,2,3,4,5,6,7,8,9};
            printBackwards(a);
        }
        
        void printBackwards( int [] b)
        {
            print(b,b.length-1);
        }
        
        void print(int [] b, int pos)
        {
            System.out.println(b[pos]); // prints last item
            if(pos != 0)
            {
                print(b,pos-1);
            }
        }
        

        希望对你有帮助!

        【讨论】:

          【解决方案11】:
          public class RecursiveArray {
          
          
             public static int[] backWardArray(int[] arr, int start, int end) {
          
                 if (start < end) {
                     int temp = arr[start];
                     arr[start] = arr[end];
                     arr[end] = temp;
                     backWardArray(arr, start + 1, end - 1);
                 }
                 return arr;
             }
          
              public static void main(String[] args) {
                  int [] arr = {12,4,6,8,9,2,1,0};
              int [] reversedArray= backWardArray(arr, 0, arr.length-1);
              //loop through the reversed array
                  for (int i: reversedArray) {
                      System.out.println(i);
                  }
              }
          
              public RecursiveArray() {
              }
          }
          

          【讨论】:

            【解决方案12】:

            这里调用reverseArray(0, n, arr) n是数组的长度

            public void reverseArray(int i, int n, int [] arr)
            {
               if(i==n)
               {
                 return ;
               } 
               else
               {
                 reverseArray(i+1, n, arr);
                 System.out.println(arr.at(i));
               }
            }
            

            【讨论】:

              【解决方案13】:
              private static void reversePrint(int[] numbers)
              {
                  if(numbers.length==0) {
                      return;
                  }
                  int[] a = new int[numbers.length -1];
                  for(int i =0;i<numbers.length-1;i++) {
                      a[i] = numbers[i+1];
                  }
                  reversePrint(a);
                  System.out.println(numbers[0]+" ");
              
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-07-25
                • 2014-04-03
                • 2010-09-26
                • 2020-07-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多