【问题标题】:reversing an array of characters without creating a new array反转字符数组而不创建新数组
【发布时间】:2009-11-08 12:56:11
【问题描述】:

如何原地反转数组(不创建新数组)?

【问题讨论】:

标签: arrays algorithm reverse


【解决方案1】:
public static int[] reverseArrayWithoutTempArray(int[] array) {
    int i = 0, j = array.length - 1;
    for (i = 0; i < array.length / 2; i++, j--) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

【讨论】:

    【解决方案2】:

    家庭作业意味着仅来自我的伪代码,您通过不指定您想要的语言而变得相对容易:-)

    把它变成你选择的语言:

    Set i1 to index of first element in array
    Set i2 to index of last element in array
    while i1 < i2:
        Set temporary variable to element number i1
        Set element number i1 to element number i2
        Set element number i2 to temporary value
        Add 1 to i1
        Subtract 1 from i2
    

    理想的做法是在您的脑海中实际运行该算法,使用一张纸来跟踪变量:

    • 数组中的每个元素。
    • i1i2
    • temporary variable

    对于更简单的算法,我倾向于这样做。我将调试语句插入到更难的那些中,以便计算机可以为我完成这项繁重的工作。从一张纸开始:

    i1 | i2 | tempvar | el[0] | el[1] | el[2] | el[3] | el[4] | el[5]
    ---+----+---------+-------+-------+-------+-------+-------+------
                          H       e       l       l       o       !
    

    然后一步一步地完成这些步骤,检查和/或更改每一列。这将使您了解它的工作原理,而不仅仅是给出一些代码。

    【讨论】:

      【解决方案3】:

      在不使用 java 创建新数组的情况下反转字符数组。

      import java.util.*;
      
      
      //Reverse string array
      public static void reverseArray(String[] array){
      
          int middle = array.length / 2;
      
          String temp;
          int j = array.length -1;
      
          for (int i = 0 ; i < middle; i++) {
              temp = array[i];
              array[i] = array[j];
              array[j] = temp;
              j--;
          }
      
          System.out.println(Arrays.toString(array));
      }
      

      如果要反转int数组,则必须将public static void reverseArray(String[] array)改为public static void reverseArray(int[] array),将String temp改为int temp

      例子:

      public static void main (String[] args) throws java.lang.Exception{
            String[] array = {"Smith", "Peter", "Michel", "John"};
            reverseArray(array);
      }
      

      输出:

      [John, Michel, Peter, Smith]
      

      【讨论】:

        【解决方案4】:

        不断交换末端,使用单个变量作为临时缓冲区。在伪代码中:

        temp = a[0]
        a[0] = a[size - 1]
        a[size - 1] = temp
        

        等等。

        【讨论】:

        • 认为应该是size - 1,而不是size - 2
        • 如果您使用过去几十年编写的编译器,它将针对其所在的体系结构进行更好的优化(可能是异或,也可能使用临时寄存器)
        • 如果使用xor swap方法,可以消除临时性。在伪代码中: a[curr] = a[curr] xor a[size - curr] a[curr] = a[curr] xor a[size - curr] a[curr] = a[curr] xor a[size - curr ] ++curr
        • 哎呀,不知道我为什么要放 size - 2。谢谢,Thomas。
        • @flyfishr64 - 坏主意。不要在这里使用 XOR 交换方法。如果有奇数个数组元素(或1个元素),将一个元素与自身进行异或交换将得到0。如果你必须检查这个条件,你还不如只使用临时变量
        【解决方案5】:
        public static void main(String args[]){
                    int j=arr.length;       
        for(int i=0;i<arr.length/2;i++){
                    int temp=arr[i];
                    arr[i]=arr[j-1-i];
                    arr[j-1-i]=temp;}
                for(int i=0;i<arr.length;i++){
                    System.out.println(arr[i]);
                }
            }
        

        【讨论】:

          【解决方案6】:

          不要费心在内存中反转数组,只需向后迭代它!

          【讨论】:

          • 如果您要将数组传递给一个向前迭代的库函数但您需要将其反转,那么您必须反转内存中的数组才能这样做。但是,在某些情况下,您是正确的。
          【解决方案7】:

          这是在不使用临时变量或其他数组的情况下反转数组元素的解决方案。这仅适用于 Java 8 及更高版本。

          void invertUsingStreams(Object[] arr2) {
              IntStream.rangeClosed(1,arr2.length)
                 .mapToObj(i -> arr2[arr2.length-i])
                 .forEach(System.out::println);
          }
          

          谢谢,

          【讨论】:

            【解决方案8】:

            这是一个完整的程序,只需复制粘贴并在您的 IDE 中运行即可:

            public class ReverseArrayWithoutAnotherArray {
            
            public static void main(String[] args) {
            
                int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            
                int middle = array.length / 2;
            
                int temp;
                int j = array.length -1;
            
                for(int a : array){
                    System.out.println(" before reverse :: " + a);
                }
                for (int i = 0 ; i < middle; i++, j--) {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            
                for(int a : array){
                    System.out.println(" after reverse :: " + a);
                }
            }
            }
            

            输出:

             before reverse :: 1
             before reverse :: 2
             before reverse :: 3
             before reverse :: 4
             before reverse :: 5
             before reverse :: 6
             before reverse :: 7
             before reverse :: 8
             before reverse :: 9
             before reverse :: 10
             after reverse :: 10
             after reverse :: 9
             after reverse :: 8
             after reverse :: 7
             after reverse :: 6
             after reverse :: 5
             after reverse :: 4
             after reverse :: 3
             after reverse :: 2
             after reverse :: 1
            

            【讨论】:

              【解决方案9】:

              在不创建新数组的情况下反转字符数组

              public static void main(String[] args) {
                  char[] a = {'1', '2', '3','4'};
                  char temp = ' ';
                  for (int i = 0; i < a.length / 2; i++) {
                      temp = a[i];
                      a[i] = a[a.length - 1 - i];
                      a[a.length - 1 - i] = temp;
                  }
                  System.out.println(a);
              }
              

              【讨论】:

                【解决方案10】:
                Array.prototype.reverse = function() {
                  for(var i = 0, j = this.length-1; i < j; i++, j--) {
                    var tmp = this[i];
                    this[i] = this[j];
                    this[j] = tmp;
                  }
                  return this;
                };
                

                【讨论】:

                  【解决方案11】:
                  • 使用临时变量来临时保存变量
                  • 使用两个索引指针,一个来自第一个索引,最后一个来自数组长度
                  • 迭代数组直到数组元素的中间
                  • 下面是我创建的函数
                  • 它适用于偶数和奇数大小
                  • 输入数组 1 4 3 2
                  • 预计输出 2 3 4 1

                  静态 int[] reverseArray(int[] a) {

                      int j=a.length-1; // last index pointer
                  
                      int middle = a.length/2; // end condition
                  
                      for (int i=0;i<middle;i++){
                          int temp=a[i];
                          a[i]=a[j];
                          a[j]=temp;
                          j--;
                      }
                  
                      return a;
                  
                  }
                  

                  【讨论】:

                    【解决方案12】:

                    var arr = [1,2,3,4,5,6]
                    for(let i=arr.length-2;i>=0;i--){
                       arr.push(arr.splice(i,1)[0])
                    }
                    console.log(arr) // [6,5,4,3,2,1]
                    
                    var arr2 = [1,2,3,4,5,6]
                    for(let i=0,j=arr2.length-1;i<arr2.length/2;i++){
                       let temp = arr2[i];
                       arr2[i] = arr2[j-i];
                       arr2[j-i] = temp
                    }
                    console.log(arr2) // [6,5,4,3,2,1]

                    【讨论】:

                      【解决方案13】:
                      import java.util.Scanner;
                      import java.util.Arrays;
                      
                      public class reversearray {
                          private static Scanner scanner=new Scanner(System.in);
                      
                          public static void main(String[] args) {
                              System.out.println("enter the count value ");
                              int n=scanner.nextInt();
                              int[] value=new int[n];
                              System.out.println("enter the elements of an array");
                              for(int i=0;i<n;i++)
                              {
                                  value[i]=scanner.nextInt();
                              }
                              reverse(value);
                      
                          }
                          public static void reverse(int[] array) {
                              int n = array.length - 1;
                              int temp = 0;
                              int count=0;
                              boolean swapped = true;
                              int mid = n / 2;
                      
                              for (int i = 0; i < mid; i++) {
                                  temp = array[i];
                                  array[i] = array[n - i];
                                  array[n - i] = temp;
                                  count++;
                              }
                              if(count==(n-mid))
                              {
                                  array[mid]=array[mid];
                              }
                              else
                              {
                                  temp=array[mid];
                                  array[mid]=array[mid+1];
                                  array[mid+1]=temp;
                              }
                      
                              System.out.println("the reveresed array elements are: " + Arrays.toString(array));
                          }
                      }
                      

                      【讨论】:

                      • 您能解释一下您的代码是做什么的,以及它与似乎更紧凑的现有答案有何不同?
                      • 我已经通过包括中间值的交换来即兴发挥它,如果你用中间值划分数组假设数组长度为 6,那么中间值将是 2 在这种情况下一个索引值保持不变所以它应该与中间值交换。如果数组的一半的长度不等于另一半,则将留下一个值,因此在这种情况下,中间值也应该交换
                      猜你喜欢
                      • 2018-02-09
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-03-18
                      相关资源
                      最近更新 更多