Java 数组反转逻辑

3
import java.util.Scanner;

public class Reverse {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int arr[] = new int[5];
        System.out.println("Enter the values in the array");
        for (int i = 0; i < arr.length - 1; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i = 0; i < 5; i++) {
            int temp;
            int j = 4;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            j--;
            System.out.println(arr[i]);
        }

    }
}

这个逻辑没有对整数数组进行反转,为什么????

输入 123

输出为 0123

3个回答

4

在这里可能尝试的一种方法是简单地交换数组中间位置两侧的每个元素:

int[] arr = new int[] {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(arr));
for (int i=0; i < arr.length/2; i++) {
    int temp = arr[i];
    int j = arr.length - i - 1;
    arr[i] = arr[j];
    arr[j] = temp;
}
System.out.println(Arrays.toString(arr));

这将打印:

[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

您目前逻辑的问题主要在于这一行:

int j = 4;

你将数组的上限指针在循环的每次迭代中赋值为4。相反,应该在循环外初始化j的值为4,并在每次迭代时递减。但是,我可能会使用我上面给出的版本。

1
@Aaditya,我已经解释了你当前代码中存在的一些问题。 - Tim Biegeleisen
1
除非你中途停止,否则你最终会再次交换所有项目,最终得到与开始时相同的字符串。 - Aditya
1
@Aaditya,你认为循环条件i < arr.length/2是在做什么?:-) - Tim Biegeleisen
1
@Aaditya,问题仍然存在吗?在读取值的for循环中,需要使用i < arr.length - 1。因为最后一个值没有被加载,它被初始化为0。 - Lajos Arpad
1
@Aaditya 抱歉,我的意思是 i < arr.length。 - Lajos Arpad
显示剩余2条评论

2
你的代码存在几个问题:
  1. 你需要在数组外初始化 j。如果你在数组内将其初始化为4,那么你将始终交换最后一个元素和第i个元素然后减少j
  2. i到达arr.length / 2时结束。想象一下这种情况:

你有以下数据集: 1 2 3 4 5

如果你走到最后,那么状态将如下:

1 2 3 4 5

5 2 3 4 1

5 4 3 2 1

5 4 3 2 1

1 4 3 2 5

1 2 3 4 5

因为你正确地交换值,直到达到数据集的一半,然后将其交换回来。你需要在半路处停止。

原始答案翻译成中文是"最初的回答"


2
很好的回答+1,你正确指出了只迭代一半数组的必要原因。我之所以这样做是为了效率,但这并不是真正的原因。 - Tim Biegeleisen

0

由于最后一个元素没有被保存,因此它被设置为0。因此,保存的数组是12340而不是1234。

反转逻辑不正确,因为您总是与最后一个元素交换。

1st iteration - 1 swaps with 0 - New string -> 02341
2nd iteration - 2 swaps with 1 - New string -> 01342
3rd iteration - 3 swaps with 2 - New string -> 01243
4th iteration - 4 swaps with 3 - New string -> 01234

如果每次都打印出整个字符串,它就会有意义。 由于每次只打印交换后的字符,因此不清楚正在发生什么。


我从循环中删除了变量j和temp,现在输入为1234,输出为12340。 - Aaditya
1
这是因为循环一直运行到结束。如果你交换两次,最终得到的输出还是相同的! - Aditya

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