不创建新数组反转字符数组

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

什么语言?还请参考以下链接: http://stackoverflow.com/questions/1469311/reverse-array-in-place https://dev59.com/XnRB5IYBdhLWcg3wkH9N +还有很多其他的。 - Dipstick
13个回答

15
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;
}

10

我的作业只要求伪代码,你没有明确指定想要用什么编程语言,这使得任务相对简单 :-)

请用你自己喜欢的编程语言实现:

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
  • 临时变量

对于较简单的算法,我倾向于这样做。对于更难的算法,我会插入调试语句,让计算机为我完成这些困难的工作。从一张纸开始:

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

只需按照每个步骤逐一进行,检查和/或更改每个列项。这将使您比仅仅获得一些代码更好地理解其工作原理。


4
使用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));
}

如果你想要反转一个整型数组,你需要将 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]

1

不创建新数组反转字符数组

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);
}

1
不断交换两端,使用单个变量作为临时缓冲区。伪代码如下:
temp = a[0]
a[0] = a[size - 1]
a[size - 1] = temp

等等。


认为应该是 size - 1,而不是 size - 2 - Thomas
如果您使用的编译器是最近几十年编写的,它将更好地针对所在的架构进行优化(可能是XOR,也可能使用寄存器临时变量)。 - Pete Kirkham
如果您使用异或交换法,可以消除临时变量。以下是伪代码: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
- Jeff Paquette
不好意思,我不确定为什么我把size减去了2。谢谢,Thomas。 - alternative
@Robert 如果你不在 for (int start = 0, end = length-1; start < end; ++start,--end) swap(array,start,end); 中检查那个条件,循环怎么会终止呢? - Pete Kirkham
显示剩余3条评论

1
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]);
        }
    }

0

这里是一个不使用临时变量或另一个数组来反转数组元素的解决方案。这仅适用于Java 8及以上版本。

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

谢谢,


0

这里有一个完整的程序,只需复制粘贴并在您的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

0
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;
};

0
不必在内存中翻转数组,只需反向迭代即可!

如果您将数组传递给一个正向迭代的库函数,但您需要它反向,那么您必须在内存中反转数组才能实现。但是,在某些情况下,您是正确的。 - alternative

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接