CodeGym /Java 博客 /随机的 /在 Java 中反转数组
John Squirrels
第 41 级
San Francisco

在 Java 中反转数组

已在 随机的 群组中发布
数组在编码中经常使用,是一种在一个变量中存储相同类型的多个值的方法。编码人员想要反转数组的原因可能有很多。可能需要反转数组,例如,当问题的逻辑需要从最后一个元素开始时。在这种情况下,最佳做法是进行反转,然后在代码中必要时使用反转数组。更重要的是,反转数组是 Java Juniors 面试中非常受欢迎的任务。

如何反转数组

反转数组的方法有很多种,这里我们考虑 5。对于选项 1,使用从原始数组末尾按升序填充的附加数组反转数组(降序),在选项 2 中是就地反转在开始和结束的数组元素交换的地方进行,在选项3中,使用Collections框架中的reverse()方法进行反转,在选项4中,List.add()List.remove()被使用,最后,在选项5中,使用了递归。在 Java 中反转数组 - 1

选项 1:使用附加数组反转数组

让我们编写一个简单的方法来使用附加数组反转数组。此选项使用一个附加数组,该数组从原始数组的最后一个元素开始按降序填充,即第一个元素与原始数组中的最后一个元素相同,第二个与倒数第二个元素相同,依此类推直到附加数组被填满。

import java.util.Arrays;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {7, 8, 9, 10, 11};
       System.out.println("Array : " + Arrays.toString(array)); // print array

       // Call function to get reversed array
       int[] reversedArray = reverse(array);
       System.out.println("Reversed array : " + Arrays.toString(reversedArray)); // print reversed array
   }

   // Method returns a new reversed array, based on the array which was passed to it.
   static int[] reverse(int[] array) {
       int[] newArray = new int[array.length];

       for (int i = 0; i < array.length; i++) {
           newArray[array.length - 1 - i] = array[i];
       }

       return newArray;
   }
}
在这个例子中,我们编写了一个方法来反转数组并根据传递给它的数组返回一个新的反转数组。数组在main中声明,然后调用方法reverse 。该方法的参数是数组。在方法reverse中,创建了一个新数组newArray ,它的大小与array相同,只是完全为空。for循环用于填充 newArray在数组的整个长度上运行。这是通过从数组的第一个元素开始并将其分配给newArray的最后一个元素来完成的,然后获取数组的第二个元素并将其分配给newArray的倒数第二个元素,依此类推;newArray向后填充。当 for 循环完成时,newArray完全充满并且是array的完全反转。
数组:[7, 8, 9, 10, 11] 反转数组:[11, 10, 9, 8, 7]

选项 2:以相反顺序打印数组元素

对于这个反转数组的选项,不需要使用额外的数组,也不会转换成数组列表。相反,数组元素就地按相反顺序放置。这意味着它们实际上被交换了。第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,依此类推。使用for循环,完成后,数组将被反转。代码如下所示:

import java.util.Arrays;
/*
reversing an array in-place
*/
public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       arrayReverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//arrayReverse is a method that reverses array in-place
   static void arrayReverse(int[] array) {
       for (int i = 0; i < array.length / 2; i++) {
           int temp = array[i];
           array[i] = array[array.length - i - 1];
           array[array.length - i - 1] = temp;
       }
   }
}
使用Arrays.toString(array) 将原始数组打印为字符串然后将我们的数组作为参数传递给reverse。在for循环的reverse方法中,创建并使用了一个变量 temp。在for循环中,反向顺序分三步实现:
  1. 将第一个元素分配给temp
  2. 将最后一个元素分配给第一个元素
  3. 将temp分配给最后一个元素
这次再次对第二个元素和从最后一个元素开始的第二个元素执行此操作,依此类推。这是针对数组的连续元素完成的,但循环仅迭代到数组大小的一半。本质上,交换数组两端的元素。此方法的运行速度是使用从 0 到 size 的for循环的方法的两倍。结果实现了数组的倒序,我们展示了如何以倒序打印数组并打印出值:
反转前的数组:[1, 4, 9, 16, 25] 反转后的数组:[25, 16, 9, 4, 1]

选项 3:使用 Collections.reverse()

在 Java 中,reverse方法是现有 Collections 框架的一部分,可用于反转数组。让我们用它来做反转。

import java.util.Arrays;
import java.util.Collections;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//method that reverses an array
   static void reverse(Integer[] array) {
       Collections.reverse(Arrays.asList(array));
   }
}
main中,创建数组并将其填充为包含 5 个数字的整数数组。然后使用Arrays.asList(array)将其作为列表打印出来,然后调用函数reverse并将数组作为参数传递给该函数。在reverse中,使用了Collections.reverse,它用在数组列表Arrays.asList(array)上,而不是数组本身。然后在下一步中,我们将展示如何使用System.out.println以相反的顺序打印数组,这次每个元素都打印在同一行上:
反转前的数组:[1, 4, 9, 16, 25] 反转后的数组:[25, 16, 9, 4, 1]

选项 4:使用 List.add() 和 List.remove() 反转数组

在这个新选项中,List.add()List.remove()用于进行反转。其工作方式是将数组转换为列表,删除列表的最后一个元素并将其放在列表的开头。在整个列表被迭代之后,新列表是原始列表的反转。在main()方法中,创建了一个包含 5 个数字的数组。然后将数组的原始状态输出到控制台。然后将该数组作为方法的参数放入reverse()。此方法的工作原理基本上是删除最后一个元素并将其插入数组的前面。最后,数组的新(反转)状态被输出到控制台。在相反()方法,通过Arrays.asList(array)将数组写入 List ,以启用add()remove()方法执行反转。此方法的工作原理基本上是删除最后一个元素并将其插入数组的前面。reverse()使用的步骤如下。它使用for循环来执行列表元素的反转。它通过初始化变量i来做到这一点。最初i设置为 0。当i = 0时,列表中list.size() - 1处的元素被删除,并且这将始终是最后一个元素,因为i < list.size() - 1. 由于remove()方法返回它已删除的元素,因此该元素现在被添加到索引i = 0的列表中,即插入到开头。然后列表的其余部分向右移动,但新列表仍然具有相同数量的元素,即size继续使用i的下一个值i = 1执行for循环,执行相同的一组步骤,因此最后一个元素被删除并放入 nums 中i = 1并且列表向右移动。这一直持续到i的最后一个增量值和列表中的所有元素都已更改。在第二索引为 i 的列表的循环元素设置为索引为 i 的数组元素,其中i0 到list.size() - 1。总而言之,使用的步骤是: 步骤:
  1. 我 = 0
  2. 删除list.size() - 1处的元素
  3. 插入元素,它位于list.size() - 1,位于 i = 0
  4. 递增
  5. 重复步骤 2 到 4(在步骤 3 中使用新的 i 值)直到 i 的最后一个增量值被使用

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }

   static void reverse(Integer[] array) {
       List list = new ArrayList<>(Arrays.asList(array));

       for (int i = 0; i < list.size() - 1; i++) {
           list.add(i, list.remove(list.size() - 1));
       }

       for (int i = 0; i < list.size(); i++) {
           array[i] = list.get(i);
       }
   }
}
此代码给出输出:
反转前的数组:[1, 4, 9, 16, 25] 反转后的数组:[25, 16, 9, 4, 1]

选项 5:通过递归反转数组

递归方法在编码中被广泛使用,可用于创建一种关于如何反转数组的有效方法。在此选项中,数组被转换为列表,然后每次删除列表末尾的最后一个元素时,代码都会进入方法reverse() ,并且列表会以相反的顺序将删除的值添加到其中。与前面的方法一样,创建了一个由 5 个数字组成的数组。然后它作为参数传递给函数reverse()。在reverse()中,要做的第一件事是将数组转换为列表并检查列表大小。如果它只有一个元素或为空,则该方法结束并返回。如果不是,则删除第一个元素,但将其复制为Integer价值。然后再次调用方法reverse()并再次开始递归。当输入函数时,执行相同的步骤,检查大小,如果列表大于 1,下一步将删除第一个元素,然后再次进行递归。当列表的大小为 1 时,reverse()返回到调用它的位置,然后列表将每个添加到它以将其构建为原始列表的完全反向。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       List list = new ArrayList<>(Arrays.asList(array));
       reverse(list);
       System.out.println("Array after reverse : " + Arrays.toString(list.toArray()));
   }

   public static void reverse(List list) {
       if (list== null || list.size() <= 1) {
           return;
       }

       Integer value = list.remove(0);

       reverse(list);

       list.add(value);
   }
}
输出是:
反转前的数组:[1, 4, 9, 16, 25] 反转后的数组:[25, 16, 9, 4, 1]

结论

所以在这里我们研究了 5 种不同的方法来反转数组。使用 Collections 框架的选项 3 可能是最好的方法,因为Collections.reverse是一个已经存在的、经过试验和测试的 Java 函数。当然可以使用其他选项,尤其是在学习时,但通常标准方法(如果存在)是最好的,因为它们通常经过高度优化和测试。但是,您可以自己创建此类方法,因为这是一个很好的编码练习,将帮助您在 Java Junior 面试中取得成功。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION